我想在添加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
答案 0 :(得分:3)
我在这里看到了一些事情。
第13行上显示undefined method
的事实是因为未分配@event变量,因此assigns(:event)
返回nil。
您应该查看为什么会发生这种情况,也许您有一些身份验证阻止您更新记录?也许你可以查看测试日志,看看实际发生了什么
可能是因为你正在使用let()
这是懒惰的,当你试图搜索它时,记录实际上还没有,但我不完全确定。您可以尝试使用let!()
,看看是否有帮助。
关于强参数的实际使用情况,如果您只想分配标题,则需要执行以下操作:
params.require(:event).permit(:title)
如果您使用permit!
,则事件参数哈希和每个子哈希都会列入白名单。