2011-09-02 17 views
5

mam kod w moim modelu (ROR 3.0.x), który jest mniej więcej tak:Testowanie after_create haki z rspec

class Message 

    after_create :notify 

    protected 

    def notify 
     if visible? 
      Notifier.message_from_portfolio(user, self).deliver 
     else 
      Notifier.invisible_message_from_portfolio(user, self).deliver 
     end 
    end 

end 

i używam najnowszą rspec gem, aby go przetestować. Problem polega na tym, że nie mogę przetestować metody powiadamiania: jeśli przetestuję ją bezpośrednio, nie mogę, ponieważ jest ona chroniona, jeśli utworzę komunikat i ustawię oczekiwania, to nie zadziała, ponieważ widocznie, mimo że rspec uruchamia powiadomienie Metoda Nie jestem w stanie złapać połączeń w czasie.

Mój spec:

describe :notification do 
    it "should send the whole message by email when visible" do 
     u = Factory.create(:user, :account_type => 1) 
     message = u.messages.build(:body => "Whatever", :author => "Nobody", :email => "[email protected]") 
     Notifier.should_receive(:message_from_portfolio) 
     message.save 
    end 
end 

Przedmiotem Notifier nie odbiera message_from_portfolio. Co ja robię źle? Propozycje?

Odpowiedz

3

Factory.create już zapisaną wiadomość, więc to nie jest stworzony, tylko zapisane. Zastąp go numerem Factory.build i wszystko powinno być w porządku.

+0

Użyto 'u.messages.build'. Czy to nie to, co sugerujesz? – lulalala

0

Czy na pewno jest osiągalne połączenie zwrotne? after_create nie zostanie wykonany, jeśli wystąpienie jest nieprawidłowe.

Można ustawić oczekiwanie dla celów debugowania:

message.should_receive(:after_create) 

A może visible? zwraca false? Aby sprawdzić, że można użyć negatywny oczekiwania:

Notifier.should_not_receive(:invisible_message_from_portfolio) 
Powiązane problemy