1

Я хотел бы протестировать мой контроллер после того, как добавил жемчужину 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

Я вижу здесь несколько вещей.

Тот факт, что он говорит undefined method в строке 13, состоит в том, что переменная @event не назначается, поэтому assigns(:event) возвращает нуль. Вы должны проверить, почему это происходит, может быть, у вас есть аутентификация, которая мешает вам обновлять запись? Возможно, вы можете проверить журналы тестирования, чтобы узнать, что происходит на самом деле.
Это может быть потому, что вы используете let(), который ленив, и запись пока не доступна, когда вы пытаетесь ее найти, но я не совсем уверен. Вы можете попробовать использовать let!() и посмотреть, поможет ли это.

Что касается фактического использования сильных параметров, если вы хотите только титул, сопоставленных вам нужно сделать что-то вроде следующего:

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

Если вы используете permit!, событие параметры хэш и каждый Subhash белого цвета.