tests run rails matchers how describe ruby-on-rails rspec

ruby on rails - run - Cómo decir "should_receive" más veces en RSpec



rspec documentation (4)

Esto esta desactualizado Por favor, compruebe 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 lo 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 en Receive Counts

Espero que ayude =)

Tengo esto en mi prueba

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

pero cuando el objeto recibe ese método llama 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 manera de decir algo así como

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


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

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. de veces sin embargo.


La nueva sintaxis esperada 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 lo menos n veces:

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


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

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

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