我正在将Rails站点从4.0升级到4.1.12,并且我的Rspec控制器测试中有相当一部分现已被破坏。例如,这个测试打破了升级:
it "update action should render edit template" do
@user = create(:user)
@user.name = "" # model requires name
@controller.stubs(:current_user).returns(@user)
put :update, id: @user
expect(response).to render_template(:edit)
end
我收到“No route matches {:action =>”show“,:controller =>”accounts“,:id => nil}缺少必需的键:[:id]”。似乎update_attributes方法突然忽略了我的模型验证。
控制器代码:
def update
@user = current_user
if @user.update_attributes(params[:user])
redirect_to user_path(@user), :notice => "Your profile has been updated."
else
render :action => 'edit'
end
end
的routes.rb
resources :users do
member do
get 'accounting'
end
collection do
post 'send_password'
end
end
我确定我在升级过程中遗漏了一些内容,但我没有在文档中看到任何告诉我这是什么的内容。
答案 0 :(得分:1)
所以只是为了放下我要做的事情 - 而不是在测试中更改@user对象,而是需要将您想要对用户对象发送的更改作为请求的参数发送。这样控制器就会在params []哈希中接收它 - 否则你并没有真正测试控制器方法正在做什么。
it "with invalid data; update action should render edit template" do
@user = create(:user)
@controller.stubs(:current_user).returns(@user)
patch :update, id: @user, user: { name: '' }
expect(response).to render_template(:edit)
end