2011-09-02 17 views
5

que tienen código en mi modelo (RoR 3.0.x), que es más o menos así:Testing ganchos 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 

y estoy usando la última joya rspec para probarlo. El problema es que no puedo probar el método de notificación: si lo pruebo directamente no puedo porque está protegido, si creo un mensaje y establezco expectativas, no funciona porque, aparentemente, aunque rspec ejecuta la notificación Metodología No puedo atrapar las llamadas a tiempo.

Mi especificación es:

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 

El notificador objeto nunca recibe message_from_portfolio. ¿Qué estoy haciendo mal? Sugerencias?

Respuesta

3

Factory.create ya ha guardado el mensaje, por lo que no se está creando, acaba de guardar. Sustitúyalo por Factory.build y todo debería estar bien.

+0

Pero se utilizó 'u.messages.build'. ¿No es eso lo que sugieres? – lulalala

0

¿Estás seguro de que se está llegando a la devolución de llamada? after_create no se ejecuta si la instancia no es válida.

También podemos establecer una expectativa para propósitos de depuración:

message.should_receive(:after_create) 

o tal vez visible? retornos falsos? Para comprobar que se puede utilizar una expectativa negativa:

Notifier.should_not_receive(:invisible_message_from_portfolio)