我的存根上的rspec put请求的正确参数是什么

ser*_*nfo 4 ruby-on-rails rspec2 rspec-rails ruby-on-rails-3

我有一个控制器规格,我得到了以下失败的期望:

 Failure/Error: put :update, :id => login_user.id, :user => valid_attributes
   #<User:0xbd030bc> received :update_attributes with unexpected arguments
     expected: ({:name=>"changed name", :email=>"changed@mail.com", :password=>"secret", :password_confirmation=>"secret"})
          got: ({"name"=>"Test user", "email"=>"user@test.com", "password"=>"secret", "password_confirmation"=>"secret"})
Run Code Online (Sandbox Code Playgroud)

对我来说,看起来我正在传递"name" => "Test User",我期待着:name => "test user"

我的规格看起来像这样:

    describe 'with valid parameters' do
      it 'updates the user' do
       login_user = User.create!(valid_attributes)
       controller.stub(:current_user).and_return(login_user)
       User.any_instance.
          should_receive(:update_attributes).
          with(valid_attributes.merge(:email => "changed@mail.com",:name=>"changed name"))
       put :update, :id => login_user.id, :user => valid_attributes
      end 
end
Run Code Online (Sandbox Code Playgroud)

我的有效属性有这样的东西:

    def valid_attributes
  {
    :name => "Test user",
    :email=> "user@test.com",
    :password => "secret",
    :password_confirmation => "secret"

  }
end
Run Code Online (Sandbox Code Playgroud)

所以我的参数有什么问题吗?

我使用Rails 3.0.5与rspec 2.6.0 ...

Dav*_*sky 8

失败消息正在告诉你究竟发生了什么:任何一个User正在期待update_attributes哈希包含的实例:email => "changed@mail.com",但它正在得到,:email => "user@test.com"因为那就是它的内容valid_attributes.同样,它期待:name => "changed_name",但得到:name => "Test user"因为那是什么valid_attributes.

您可以简化此示例并避免这种混淆.这里没有必要使用valid_attributes因为无论如何should_receive拦截了update_attributes呼叫.我通常这样做:

controller.stub(:current_user).and_return(mock_model(User)) # no need for a real user here
User.any_instance.
  should_receive(:update_attributes).
  with({"these" => "params"})
put :update, :id => login_user.id, :user => {"these" => "params"}
Run Code Online (Sandbox Code Playgroud)

这样,预期值和实际值在示例中是正确的,并且它清楚地表明它们的真实性并不重要:无论:user是直接传递给的哈希值update_attributes.

合理?