¿Cómo puedo agregar múltiples expectativas que deban recibirse en un objeto utilizando RSpec?
-
04-07-2019 - |
Pregunta
En mi controlador Rails, estoy creando varias instancias de la misma clase de modelo. Quiero agregar algunas expectativas de RSpec para poder probar que está creando el número correcto con los parámetros correctos. Entonces, esto es lo que tengo en mi especificación:
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3) Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4)
Esto está causando problemas porque parece que la clase Bandmate solo puede tener 1 " should_receive " expectativa puesta en ella. Entonces, cuando ejecuto el ejemplo, aparece el siguiente error:
Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created' Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"})
Esos son los parámetros correctos para que se cree la segunda llamada, pero RSpec está probando contra los parámetros incorrectos.
¿Alguien sabe cómo puedo configurar mis deberes para recibir las expectativas y permitir múltiples llamadas diferentes?
Solución
Las expectativas múltiples no son un problema en absoluto. Lo que está encontrando son problemas de orden, dados sus argumentos específicos sobre expectativas desordenadas. Consulte esta página para obtener detalles sobre las expectativas de pedidos.
El cuento es que debes agregar .ordered
al final de cada una de tus expectativas.
Otros consejos
my_mock.should_receive (: sym) .once
my_mock.should_receive (: sym) .twice
my_mock.should_receive (: sym) .exactly (n) .times
my_mock.should_receive (: sym) .at_least (: once)
my_mock.should_receive (: sym) .at_least (: dos veces)
my_mock.should_receive (: sym) .at_least (n) .times
my_mock.should_receive (: sym) .at_most (: once)
my_mock.should_receive (: sym) .at_most (: dos veces)
my_mock.should_receive (: sym) .at_most (n) .times
my_mock.should_receive (: sym) .any_number_of_times
También funciona para rspec 2.5.