2009-08-25 8 views
100

J'ai dans mon essaiComment dire plusieurs fois « should_receive » dans RSpec

Project.should_receive(:find).with(@project).and_return(@project) 

mais quand l'objet reçoit cet appel de méthode deux fois, je dois faire

Project.should_receive(:find).with(@project).and_return(@project) 
Project.should_receive(:find).with(@project).and_return(@project) 

Y at-il façon de dire quelque chose comme

Project.should_receive(:find).with(@project).and_return(@project).times(2) 

Répondre

209

Ceci est obsolète. S'il vous plaît vérifier la réponse Uri ci-dessous

pour 2 fois:

Project.should_receive(:find).twice.with(@project).and_return(@project) 

pour exactement n fois:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project) 

pour les temps au moins n:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project) 

plus de détails à https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts sous Nombre de réceptions

Hope it helps =)

+3

On dirait que cela ne fonctionne peut-être pas avec 'any_instance'? –

+0

@JaredBeck pourquoi? –

+0

@YoLudke Je ne sais pas –

0

should_receive, par opposition à any_instance, prévoit que la classe reçoit un message le nombre de fois. D'autre part, est généralement utilisé pour coudre une méthode. Donc, le premier cas est une attente que nous aimerions tester, tandis que le second passe d'une méthode à la ligne suivante pour que nous puissions passer à autre chose.

+1

Drenmi J'apprécie le temps que vous avez pris pour ajouter quelques virgules à un post que j'avais ajouté il y a près d'un an ... Il ne semblait pas y avoir de changement à l'aspect technique de la réponse ... Pourquoi voudriez-vous descendre Votez-moi pour ça ...? – amnsan

38

La nouvelle expect syntaxe de rspec ressemblera à ceci:

pour 2 fois:

expect(Project).to receive(:find).twice.with(@project).and_return(@project) 

pour exactement n fois:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project) 

pour au moins n fois:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project) 
+1

La syntaxe 'have_received' fonctionne également. 'expect (Project) .to have_received (: trouver) .exactement (n) .fois etc. –

0

@JaredBeck a souligné. La solution n'a pas fonctionné pour moi sur any_instance appel.

Pour toute instance j'ai fini par utiliser stub au lieu de should_receive.

Project.any_instance.stub(:some_method).and_return("value") 

Cela fonctionnera pour tout no. de fois cependant.

+0

http://stackoverflow.com/questions/24595203/rspec-any-instance-deprecation-how-to-fix-it –

Questions connexes