我有一个控制器规范,我得到了以下失败的期望:
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"})
对我来说,看起来我正在通过"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
对于我的有效属性,我有这样的东西:
def valid_attributes
{
:name => "Test user",
:email=> "user@test.com",
:password => "secret",
:password_confirmation => "secret"
}
end
那么我的参数有什么问题,有什么建议吗?
我正在使用Rails 3.0.5和rspec 2.6.0…
失败消息准确地告诉您发生了什么: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"}
通过这种方式,期望值和实际值在示例中是正确的,这表明它们是什么并不重要:作为:user
传递的任何哈希都会直接传递给update_attributes
。
有道理吗?