2009-10-21 8 views
4

Je veux juste un talon de modèle spécifique , mais pas seulement un objet spécifique et ne tous les casRails Test & Mocha: Comment talonner un modèle spécifique - conditionnel any_instance?

Par ex Classe donnée 'Person' avec les attributs 'name' (chaîne) et 'cool' (booléen). Nous avons deux modèles:

person_bill: 
    name: bill 
    cool: false 

person_steve: 
    name: steve 
    cool: false 

Maintenant, je veux juste bouchonner steve, qui fonctionne bien:

p1 = people(:person_steve) 
p1.stubs(:cool? => true) 
assert p1.cool? #works 

Mais si je charge à nouveau de modèle DB non:

p1 = people(:person_steve) 
p1.stubs(:cool? => true) 
p1 = Person.find_by_name p1.name 
assert p1.cool? #fails!! 

Cela fonctionne, mais affecte Bill ainsi, ce qui ne devrait pas:

Person.any_instance.stubs(:cool? => true) 
assert people(:person_bill).cool? #doesn't fails although it should 

Alors, comment puis-je juste Steve stub, mais dans tous les cas? Y a-t-il une conditionnel comme une instance comme

Person.any_instance { |p| p.name == 'Steve' }.stubs(:cool? => true) 

Merci d'avance! Pourquoi ne pas simplement remplacer la méthode qui génère l'objet?

Répondre

7

Person.stubs(:find_by_name). 
     returns(stub(:cool? => true)) 

Je pense que c'est la bonne réponse (et simple). Je suis à peu près certain qu'il n'y a rien comme votre syntaxe any_instance. Vous trouverez peut-être quelque chose d'utile dans la syntaxe de la séquence:

Pourriez-vous donner un autre exemple de ce que vous cherchez? Bonne chance!

+1

bien dans ce cas, mais mon problème actuel est un peu plus difficile. J'en ai besoin pour un test de contrôleur où la méthode de recherche est beaucoup plus «profonde» dans le code. Mais bon, une bonne partie de l'approche de test n'était pas acceptable, alors je l'ai changé pour que ça marche. Mais encore je suis curieux de savoir comment faire ce travail en tout cas .... – RngTng

+2

Le remède pour le code profond le rend peu profond :-). En TDD ou de bons tests unitaires, vous voulez éviter le code complexe et l'imbrication profonde. Si c'est difficile à tester, la meilleure approche n'est pas un test complexe pour le code complexe. Mieux vaut simplifier/re-factoriser le code et écrire un test simple! – mixonic

Questions connexes