2009-05-27 8 views
3

Assumer ce code ruby:Mocha: Comment définir une attente pour une méthode d'instance?

class User 
    def self.failed_login!(email) 
    user = User.find_by_email(email) 
    if user 
     user.failed_login_count = user.failed_login_count + 1 
     user.save 
    end 
    end 
end 

Je veux écrire un test qui teste que user.save est jamais appelé lorsqu'un mail invalide est donnée. E.g .:

it "should not increment failed login count" do 
    User.expects(:save).never() 
    User.failed_login!("doesnotexist") 
end 

Ce test est actuellement réussi, mais il réussit également lorsque je fournis une adresse e-mail valide.

Comment puis-je définir l'attente en utilisant Mocha? (ou tout autre cadre moqueur) de sorte qu'il teste la méthode de sauvegarde de toute instance de l'utilisateur n'est jamais appelée?

(de préférence sans stubbing/se moquant de la méthode find_by_email, comme la mise en œuvre de la façon d'obtenir l'utilisateur pourrait changer à l'avenir)

Vive

Répondre

16

Pour d'autres qui auraient pu trébuché jusqu'à ce, j'ai trouvé la répondre dans un autre poste qui traitait avec RR comme cadre moqueur ... en Mocha vous pouvez le faire:

User.any_instance.expects(:save).never() 
+1

Méfiez-vous simplement de l'exécuter avec des mpc RSpec, car cela affectera _all_ instances suivantes. Mocha tire le simulacre vers le bas comme prévu, par spec. – avocade

4

Sinon, vous pouvez faire quelque chose comme

user = mock 
User.expects(:find).returns user 
user.expects(:save).never 
+4

Le User.expects (: find) serait probablement mieux comme User.stubs (: find) dans ce cas, car nous ne nous soucions pas vraiment de savoir si User.find est appelé - juste que User # save n'est pas appelé. –

Questions connexes