Comment dire "devrait_recevoir" plus de fois dans RSpec


112

J'ai ça dans mon test

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 a-t-il un moyen de dire quelque chose comme

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

Réponses:


214

C'est obsolète. Veuillez vérifier la réponse d'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)

pendant au moins n fois:

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

plus de détails sur https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts sous Recevoir les comptes

J'espère que ça aide =)


3
On dirait que peut-être que cela ne fonctionne pas avec any_instance?
Jared Beck

@YoLudke je ne sais pas
Jared Beck

2
Devrait utiliser la nouvelle syntaxe mentionnée dans la réponse d'Uri .
theblang

61

La nouvelle expectsyntaxe 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)

pendant au moins n fois:

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

1
La have_receivedsyntaxe fonctionne également. expect(Project).to have_received(:find).exactly(n).timesetc.
David Tuite

0

A souligné @JaredBeck. La solution n'a pas fonctionné pour moi sur any_instanceappel.

Dans tous les cas, j'ai fini par utiliser stub au lieu de should_receive.

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

Cela fonctionnera pour tout non. des fois cependant.



0

should_receive, par opposition à any_instance, s'attend à ce que la classe reçoive le message le nombre de fois spécifié.

any_instance d'autre part, est généralement utilisé pour le stubbing d'une méthode.

Ainsi, le premier cas est une attente que nous aimerions tester, tandis que le second passe d'une méthode à la ligne suivante afin que nous puissions passer à autre chose.


1
Drenmi J'apprécie le temps que vous avez pris pour ajouter quelques virgules à un message que j'avais ajouté il y a presque un an ... Il ne semblait pas qu'il y ait eu de changement dans l'aspect technique de la réponse ... Pourquoi voteriez-vous contre moi pour ça ...?
amnsan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.