ruby on rails - test - ¿Cómo puedo agregar múltiples expectativas de should_receive sobre un objeto usando RSpec?
rspec tutorial (2)
En mi controlador de 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 expectativa "should_receive". Entonces, cuando ejecuto el ejemplo, obtengo 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 la segunda llamada a crear, pero RSpec prueba contra los parámetros incorrectos.
¿Alguien sabe cómo puedo configurar mis expectativas should_receive para permitir múltiples llamadas diferentes?
Las múltiples expectativas no son un problema en absoluto. Lo que te estás encontrando es ordenar problemas, dado tus argumentos específicos sobre las expectativas desordenadas. Consulte esta página para obtener detalles sobre las expectativas de pedido.
La historia corta es que debe agregar .ordered
al final de cada una de sus expectativas.
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 (: una vez)
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 (: una vez)
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.