rspec: Comment stub une méthode d'instance appelée par le constructeur?
class A
def initialize
@x = do_something
end
def do_something
42
end
end
Comment puis-je stub do_something
dans rspec, avant la mise en place initiale est appelée (donc l'attribution de 42 à @x
)? Et sans changer la mise en œuvre, bien sûr.
Vous devez vous connecter pour publier un commentaire.
Voici le commit qui ajoute la fonction de rspec - C'était le 25 Mai 2008. Avec cela, vous pouvez faire
Cependant, le dernier joyau de la version de rspec (1.1.11, octobre 2008) n'ont pas ce patch en elle.
Ce billet états qu'ils arrachent pour des raisons de maintenance, et une solution de rechange n'a pas encore été fournis.
N'a pas l'air comme vous pouvez le faire à ce point. Vous devrez hack de la classe manuellement à l'aide de alias_method ou somesuch.
any_instance
, puis de construire l'objet, puis utilisezrspec_reset
pour annuler tous les talons avant que le constructeur est appelé à nouveau. Noterspec_reset
n'est pas documentée et ne peuvent pas être pris en charge officiellement. Vous appelez ça sur n'importe quel objet pour le supprimer de l'objet en talonsJ'ai trouvé cette solution sur http://pivotallabs.com/introducing-rr/
Je ne sais pas comment faire cela dans spec faux-cadre, mais vous pouvez facilement en échange de moka pour effectuer les opérations suivantes:
ou avec RR:
Dans la dernière version de RSpec d'aujourd'hui - 3.5, vous pouvez:
Je fais comme Denis Barushev réponse. Et j'aimerais vous suggérer un seul changement cosmétique qui fait
new_method
variable inutile. Rspec ne munge sur écrasé de méthodes, de sorte qu'ils puissent être accessibles avecproxied_by_rspec__
préfixe:Dans RSpec 2.6 ou version ultérieure, vous pouvez utiliser
Voir les docs pour plus de détails. (Merci à rogerdpack pour préciser que c'est désormais possible - j'ai pensé qu'il méritait une réponse de sa propre)
De stub une méthode d'instance, vous pouvez faire quelque chose comme ceci:
Mais comme pschneider l'a souligné, il suffit de retourner 42 sur les nouvelles avec:
A.stub(:new).and_return(42)
ou quelque chose à cet effet.A.stub(:new).and_return(@my_stub)
sera de retour l'instance tampon à chaque fois, ce qui vous donne le contrôle sur la création de l'instance. Aussi loin que la définition de la variable membre, j'ai toujours entendu dire que vous n'êtes pas censé vous soucier des internes en se moquant/stubbing, juste interfaces publiques. Donc, il suffit de retourner les valeurs correctes pour la méthode qui dépend@x
. Je suis probablement mal siIci est une idée qui est peut-être pas très élégant, mais est fondamentalement assurez-vous de travail:
Créer une petite classe qui hérite de la classe, vous voulez tester, substituez la méthode initialize et appel
super
après avoir créé les talons dans l'initialiser, comme suit:Et là vous allez! J'ai juste utilisé avec succès dans un de mes tests.
La rspec_candy bijou est livré avec un
stub_any_instance
méthode d'assistance qui fonctionne dans les deux RSpec 1 et RSpec 2.Dans ma version de rspec (1.2.2) je peux le faire:
Je sais que c'est probablement à la fin de la réponse à l'affiche originale, mais j'y réponds quand même pour référence future, que je suis venu ici avec la même question, mais comprendre c'est de travailler sur la dernière rspec version.