je un objettester une relation has_one?
class User < ActiveRecord::Base
has_one :subscription
end
et j'ai ce test:
it "should increment shipped count when item_shipped" do
@user.attributes = @valid_attributes
@user.save
subscription = mock_model(Subscription)
subscription.stub!(:item_shipped!)
subscription.stub!(:user_id)
@user.subscription = subscription
lambda{@user.item_shipped!}.should change{@user.shipped_count}.by(1)
end
Mais je reçois une erreur:
1)
Spec::Mocks::MockExpectationError in 'User should increment shipped count when item_shipped'
Mock "Subscription_1113" received unexpected message :[]= with ("user_id", 922717357)
./spec/models/user_spec.rb:29:
Je ne suis pas sûr de savoir comment se moquer de cela et Je n'arrive pas à trouver de références à ce genre de chose.
Merci de ... qui ne semble pas fonctionner , mais cela pourrait être dû au fonctionnement interne de item_shipped! J'ai besoin de me moquer de l'abonnement parce qu'il est appelé à partir de la méthode que je suis en train de tester. – phil
Oui, c'est difficile à dire sans connaître les détails de la méthode. Gardez à l'esprit que les simulacres sont destinés à être utilisés pour créer des attentes spécifiques. En d'autres termes, si votre spécification ne va pas affirmer qu'une certaine méthode sur un objet mocké sera appelée, il n'est pas nécessaire de se moquer de cet objet. Remplissez simplement toutes les méthodes sur une instance réelle de l'objet qui invoquerait des opérations lourdes ou autrement inédites/non désirées. Comme le fait remarquer Martin Fowler, les mocks ne sont pas des stubs: http://martinfowler.com/articles/mocksArentStubs.html –
Gardez également à l'esprit que si l'utilisateur attend une valeur de retour de l'abonnement dans les composants internes de l'utilisateur # item_shipped !, vous ' ll faut définir la valeur de retour sur la méthode stubbed (voir edit). –