4

私はコントローラーの仕様を持っていますが、次のような期待に失敗します。

 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

だから私のパラメータの何が問題になっていますか?

Rails3.0.5とrspec2.6.0を使用しています...

4

1 に答える 1

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_receiveupdate_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ます。

わかる?

于 2011-05-27T08:19:58.720 に答える