1

添加 strong_parameters gem 后,我想测试我的控制器,该怎么做?我试过:

控制器

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
4

1 回答 1

3

我看到这里发生了一些事情。

它在第 13 行所说的事实undefined method是因为未分配 @event 变量,因此assigns(:event)返回 nil。您应该检查为什么会发生这种情况,也许您有一些身份验证阻止您更新记录?也许您可以查看测试日志以了解实际情况。
这可能是因为您正在使用let()which 是惰性的,并且当您尝试搜索它时该记录实际上还不可用,但我不完全确定。您可以尝试使用let!(),看看是否有帮助。

关于强参数的实际使用,如果您只希望标题可分配,则需要执行以下操作:

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

如果使用permit!,则事件参数散列并且每个子散列都被列入白名单。

于 2013-03-20T10:41:32.763 回答