Rails中控制器中断的更新测试4.1.12

时间:2015-07-04 14:16:08

标签: ruby-on-rails ruby rspec

我正在将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

我确定我在升级过程中遗漏了一些内容,但我没有在文档中看到任何告诉我这是什么的内容。

1 个答案:

答案 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