2010-05-24 16 views
17

Tout comme this question, j'utilise aussi nifty_scaffold de Ryan Bates. Il a l'aspect souhaitable d'utiliser la méthode any_instance de Mocha pour forcer un état "invalide" dans les objets de modèle enterrés derrière le contrôleur. Contrairement à la question à laquelle je suis lié, je n'utilise pas RSpec, mais Test :: Unit. Cela signifie que les deux solutions RSpec-centric ne fonctionneront pas pour moi.Existe-t-il un moyen d'annuler le stochage Moka de any_instance dans Test :: Unité

Existe-t-il un moyen général (ie: fonctionne avec Test :: Unit) de supprimer le stubbing any_instance? Je crois que cela provoque un bug dans mes tests, et je voudrais vérifier cela.

Répondre

31

Comme il arrive, Mocha 0.10.0 permet unstubbing on any_instance().

str = "Not Stubbed!" 
String.any_instance.stubs(:to_s).returns("Stubbed!") 
puts str.to_s # "Stubbed!" 
String.any_instance.unstub(:to_s) 
puts str.to_s # "Not Stubbed!" 
4

Mocha ne fournit pas une telle fonctionnalité. Cependant vous pouvez l'implémenter vous-même.

La première chose que nous devrions savoir à propos de mocha est que mocha remplace les méthodes d'origine lorsque vous les stockez. Donc, afin de pouvoir restaurer ces méthodes plus tard, vous devez garder une référence aux anciennes. Il peut être facilement réalisé par: alias new_method old_method. Il doit être fait avant en se moquant du old_method.

Maintenant, pour débloquer une méthode, vous avez seulement besoin de alias old_method new_method.

Consultez le code suivant:

class A 
    def a 
     true 
    end 
end 


class TestA < Test::Unit::TestCase 
    def test_undo_mock 
     a = A.new 
     A.class_eval {alias unmocked_a a} 

     A.any_instance.stubs(:a).returns("b") 
     assert a.a, "b" 

     A.class_eval {alias a unmocked_a} 
     assert a.a, "a" 
    end 
end 
+0

Excellent. Cela ressemble à quelque chose qui pourrait être ajouté/monkeypatched dans Mocha aussi. –

+0

Je n'ai jamais ressenti le besoin de cette fonctionnalité, mais il y a un billet - http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/69-allow-unstubbing-of-methods si vous voulez faire du lobbying pour le changement. Ce serait génial si vous avez quelques exemples de pourquoi vous voudriez l'utiliser. –

+0

J'ai ajouté une fonctionnalité de décodage - Mocha :: ObjectMethods # unstub - voir http://mocha.rubyforge.org/classes/Mocha/ObjectMethods.html#M000009 –

0

Si vous voulez supprimer tous vos talons/attentes en une seule fois, alors vous pouvez le faire en utilisant mocha_teardown (par exemple, appeler self.mocha_teardown.).

Peut être un peu destructeur dans ce cas, cependant.