Cómo decir "should_receive" más veces en RSpec

112

Tengo esto en mi prueba

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

pero cuando el objeto recibe esa llamada al método dos veces, tengo que hacer

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

¿Hay alguna forma de decir algo como

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

Respuestas:

214

Esto está desactualizado. Por favor verifique la respuesta de Uri a continuación.

por 2 veces:

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

exactamente n veces:

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

por al menos n veces:

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

más detalles en https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts bajo Recibir recuentos

Espero que ayude =)

Staelen
fuente
3
¿Parece que tal vez esto no funciona any_instance?
Jared Beck
@YoLudke No lo sé
Jared Beck
2
Debería usar la nueva sintaxis mencionada en la respuesta de Uri .
theblang
61

La nueva expectsintaxis de rspec se verá así:

por 2 veces:

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

exactamente n veces:

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

por al menos n veces:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)
Uri Agassi
fuente
1
La have_receivedsintaxis también funciona. expect(Project).to have_received(:find).exactly(n).timesetc.
David Tuite
0

@JaredBeck señaló. La solución no funcionó para mí de any_instanceguardia.

En cualquier caso, terminé usando stub en lugar de should_receive.

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

Esto funcionará para cualquier no. aunque muchas veces.

Prasanna
fuente
0

should_receive, a diferencia de any_instance, espera que la clase reciba el mensaje el número especificado de veces.

any_instance por otro lado, generalmente se usa para cortar un método.

Entonces, el primer caso es una expectativa que nos gustaría probar, mientras que el segundo es pasar de un método a la siguiente línea para que podamos seguir adelante.

amnsan
fuente
1
Drenmi, agradezco el tiempo que se ha tomado para agregar algunas comas a una publicación que había agregado hace casi un año ... No parecía que hubiera ningún cambio en el aspecto técnico de la respuesta ... ¿Por qué votaría en contra yo por esto ...?
amnsan