Como dizer “deveria_ receber” mais vezes no RSpec


112

Eu tenho isso no meu teste

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

mas quando o objeto recebe aquela chamada de método duas vezes, eu tenho que fazer

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

Existe alguma maneira de dizer algo como

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

Respostas:


214

Isso está desatualizado. Por favor, verifique a resposta de Uri abaixo

por 2 vezes:

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

por exatamente n vezes:

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

por pelo menos n vezes:

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

mais detalhes em https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts em Receber contagens

Espero que ajude =)


3
Parece que talvez isso não funcione any_instance?
Jared Beck

@YoLudke Eu não sei
Jared Beck

2
Deve usar a nova sintaxe mencionada na resposta do Uri .
theblang de

61

A nova expectsintaxe de rspec será semelhante a esta:

por 2 vezes:

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

por exatamente n vezes:

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

por pelo menos n vezes:

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

1
A have_receivedsintaxe também funciona. expect(Project).to have_received(:find).exactly(n).timesetc.
David Tuite

0

@JaredBeck apontou. A solução não funcionou para mim de any_instanceplantão.

Para qualquer instância, acabei usando stub em vez de should_receive.

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

Isso vai funcionar para qualquer não. muitas vezes.



0

should_receive, ao contrário any_instance, espera que a classe receba a mensagem o número especificado de vezes.

any_instance por outro lado, geralmente é usado para esboçar um método.

Portanto, o primeiro caso é uma expectativa que gostaríamos de testar, enquanto o segundo é passar de um método para a próxima linha para que possamos seguir em frente.


1
Drenmi Agradeço o tempo que você dedicou para adicionar algumas vírgulas a uma postagem que eu adicionei há quase um ano ... Não parece que houve qualquer alteração no aspecto técnico da resposta ... Por que você votaria contra eu por isso ...?
amnsan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.