2011-09-13 10 views
6

Używam FactoryGirl i Rspec do testowania. Model ustawia klucz obcy po init, jeśli jest zerowy. Dlatego wykorzystuje dane innego skojarzenia. Ale jak mogę to przetestować? Normalnie chciałbym użyć fabryki do stworzenia tego obiektu i użyć łańcucha stub_chain dla "self.user.main_address.country_id". Ale wraz z utworzeniem tego obiektu, po zainicjowaniu zostanie wywołany. Nie mam szansy go zamknąć.Jak przetestować wywołanie zwrotne after_initialize modelu szyn?

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

Każdy pomysł?

Odpowiedz

8

Najlepiej, aby zamiast implementacji sprawdzać zachowanie. Sprawdź, czy klucz obcy zostanie ustawiony zamiast testowania wywołania metody.

Chociaż, jeśli chcesz przetestować wywołanie zwrotne after_initialize, jest to sposób, który działa.

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

Allocate stawia obiekt w pamięci, ale nie nazywają initialize. Po ustawieniu oczekiwań można wywołać inicjowanie i przechwycić wywołanie metody.

5

Metoda Orlanda działa, a tutaj jest jeszcze jedna, którą chciałbym dodać. (Stosując nową składnię "spodziewana" rspec)

expect_any_instance_of(Model).to receive(:method_here) 
Model.new 
Powiązane problemy