web-dev-qa-db-fra.com

Comment dire "devrait_recevoir" plusieurs fois dans RSpec

J'ai ceci 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)

Est-il possible de dire quelque chose comme

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

C'est obsolète. Veuillez vérifier 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 under Recevoir des comptes

J'espère que ça aide =)

214
Staelen

La nouvelle syntaxe expect 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)
48
Uri Agassi

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

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

Donc, le premier cas est une attente que nous aimerions tester, tandis que le second passe une méthode à la ligne suivante pour que nous puissions continuer.

0
amnsan

@JaredBeck l'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 non. des fois cependant.

0
prasann