1

strong_parameters gem을 추가 한 후 내 컨트롤러를 테스트하고 싶습니다. 어떻게해야합니까? 내가 시도 :컨트롤러 사양에서 strong_parameters를 테스트하는 방법은 무엇입니까?

컨트롤러

class EventsController < ApplicationController 
    def update 
    @event = Event.find(params[:id]) 
    respond_to do |format| 
     if @event.update_attributes(event_params) 
     format.html { redirect_to(@event, :notice => 'Saved!') } 
     else 
     format.html { render :action => "new" } 
     end 
    end 
    end 

    private 
    def event_params 
    params.require(:event).permit! 
    end 
end 

사양

describe EventsController do 
    describe "PUT update" do 
    describe "with forbidden params" do 
     let(:event) { Event.create! title: "old_title", location: "old_location", starts_at: Date.today } 

     it "does not update the forbidden params" do 
     put :update, 
      id: event.to_param, 
      event: { 'title' => 'new_title', 'location' => 'NY' } 

     assigns(:event).title.should eq('new_title') # explicitly permitted 
     assigns(:event).location.should eq("old_location") # implicitly forbidden 

     response.should redirect_to event 
     end 
    end 
    end 
end 

오류

1) EventsController PUT update with forbidden params does not update the forbidden params 
    Failure/Error: assigns(:event).title.should eq('new_title') # explicitly permitted 
    NoMethodError: 
    undefined method `title' for nil:NilClass 
    # ./spec/controllers/events_controller_spec.rb:13:in 

답변

3

여기에 몇 가지 일이 일어나는 것을 볼 수 있습니다.

라인 13에 undefined method이 있다는 사실은 @event 변수가 지정되지 않았기 때문에 assigns(:event)은 nil을 반환합니다. 왜 그런 일이 일어나고 있는지 확인해야합니다. 레코드를 업데이트하지 못하게하는 인증이있을 수 있습니다. 어쩌면 테스트 로그를 체크 아웃하여 실제로 진행중인 작업을 확인할 수 있습니다.
let()은 게으르며 검색을 시도 할 때 실제로 사용할 수있는 레코드가 아니기 때문에 그럴 수 있습니다. 그러나 완전히 확신 할 수는 없습니다. let!()을 사용해보고 도움이되는지 확인해보세요. 당신이 permit! 사용하는 경우

params.require(:event).permit(:title) 

, 이벤트는 해시 모든 subhash 매개 변수 : 만 할당 할 제목을 원하는 경우 강력한 매개 변수의 실제 사용에 관해서

, 당신은 다음과 같은 것을 할 필요가 허용 목록에 포함됩니다.

관련 문제