2011-09-02 17 views
5

Ho codice nel mio modello (RoR 3.0.x) che è più o meno così:Test ganci after_create con 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 

E sto usando l'ultima gemma RSpec per testarlo. Il problema è che non sono in grado di testare il metodo di notifica: se lo provo direttamente non posso perché è protetto, se creo un messaggio e impostato le aspettative non funziona perché apparentemente anche se rspec esegue la notifica metod Non sono in grado di prendere le chiamate in tempo.

mia specifica è:

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 

Il Notifier oggetto non riceve mai message_from_portfolio. Che cosa sto facendo di sbagliato? Suggerimenti?

risposta

3

Factory.create ha già salvato il messaggio, quindi non è in fase di creazione, appena salvato. Sostituirlo con Factory.build e tutto dovrebbe andare bene.

+0

E 'stato utilizzato 'u.messages.build'. Non è quello che suggerisci? – lulalala

0

Sei sicuro che il callback è stato raggiunto? after_create non viene eseguito se l'istanza non è valida.

È possibile impostare l'aspettativa per il debug:

message.should_receive(:after_create) 

O forse visible? rendimenti falsi? Per controllare che si potrebbe usare un aspettativa negativa:

Notifier.should_not_receive(:invisible_message_from_portfolio)