2008-10-28 7 views
26

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. Por lo tanto, esto es lo que tengo en mi especificación:¿Cómo puedo agregar múltiples expectativas de should_receive sobre un objeto usando RSpec?

 
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 compañero de banda solo puede tener 1 "should_receive" expectativa fija en él. Por lo tanto, cuando corro el ejemplo, me sale 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 está poniendo a prueba en contra de los parámetros erróneos.

¿Alguien sabe cómo puedo configurar mis expectativas should_receive para permitir múltiples llamadas diferentes?

+0

Eso debería funcionar. ¿Qué versión de RSpec estás usando? Intente llamar a los métodos de código en secuencia de la especificación (Bandmate.create (...: user_id => @ user.id ...); Bandmate.create (...: user_id => "2222" ...); ...) y ver si funciona. –

Respuesta

34

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 this page para obtener detalles sobre las expectativas de pedido.

La historia corta es que debe agregar .ordered al final de cada una de sus expectativas.

+0

Huh, está funcionando ahora incluso sin pedidos. Supongo que cometí un error en mi código y lo atribuí a RSpec. ¡Gracias por el consejo! – Micah

+0

El enlace es 404 en github – xxjjnn

+0

La página anterior tiene 404. Creo que es ésta ahora: http://rspec.info/documentation/3.3/rspec-mocks/#Ordering – AmitA

-1

Mock Receive Counts

my_mock.should_receive (: sym) .Una vez
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_m ock.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

Works para rspec 2.5 también.

+14

no cubre los diferentes argumentos que deben recibirse para cada llamada. – sevenseacat

+1

¿cómo lo haces con diferentes argumentos? –

Cuestiones relacionadas