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)
Jakub Arnold
fonte

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 =)

Staelen
fonte
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)
Uri Agassi
fonte
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.

Prasanna
fonte
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.

Amnsan
fonte
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