2011-09-13 8 views
6

Sto usando FactoryGirl e Rspec per il test. Il modello imposta una chiave esterna dopo init se è nullo. Pertanto utilizza i dati di un'altra associazione. Ma come posso testarlo? Normalmente userei un factory per la creazione di questo oggetto e uso una stub_chain per "self.user.main_address.country_id". Ma con la creazione di questo oggetto, dopo l'inizializzazione verrà invocato. Non ho alcuna possibilità di spegnerlo.Come testare after_initialize callback di un modello di rotaie?

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

Qualche idea?

risposta

8

Idealmente è meglio testare il comportamento anziché l'implementazione. Verificare che la chiave esterna venga impostata invece di verificare che il metodo venga chiamato.

Sebbene, se si desidera testare il callback after_initialize qui è un modo che funziona.

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

Allocate mette l'oggetto in memoria, ma non chiama initialize. Dopo aver impostato l'aspettativa, è possibile chiamare l'inizializzazione e prendere la chiamata al metodo.

5

Il metodo di Orlando funziona, ed eccone un altro che vorrei aggiungere. (Utilizzando la nuova sintassi 'expect' di rspec)

expect_any_instance_of(Model).to receive(:method_here) 
Model.new 
Problemi correlati