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.