2011-09-13 11 views
6

Estoy usando FactoryGirl y Rspec para realizar pruebas. El modelo establece una clave foránea después de init si es nula. Por lo tanto, usa datos de otra asociación. Pero, ¿cómo puedo probarlo? Normalmente usaría una fábrica para la creación de este objeto y usaría un stub_chain para "self.user.main_address.country_id". Pero con la creación de este objeto, después de la inicialización se invocará. No tengo oportunidad de colgarlo.¿Cómo se prueba after_initialize la devolución de llamada de un modelo de rieles?

after_initialize do 
    if self.country_id.nil? 
    self.country_id = self.user.main_address.country_id || Country.first.id 
    end 
end 

¿Alguna idea?

Respuesta

8

Idealmente, es mejor que pruebe el comportamiento en lugar de la implementación. Pruebe que la clave externa se configure en lugar de probar que se llame al método.

Aunque, si desea probar la devolución de llamada after_initialize aquí hay una manera que funciona.

obj = Model.allocate 
obj.should_receive(:method_here) 
obj.send(:initialize) 

Allocate pone el objeto en la memoria, pero no llama initialize. Después de establecer la expectativa, puede llamar a inicializar y atrapar la llamada al método.

5

El método de Orlando funciona, y aquí hay otro que me gustaría agregar. (Usando la nueva sintaxis 'espere' rspec)

expect_any_instance_of(Model).to receive(:method_here) 
Model.new 
Cuestiones relacionadas