2011-08-24 19 views
6

¿Alguien sabe cómo se puede spec una notificación apoyo activo? Lo siguiente no parece funcionar. Detecta las notificaciones predeterminadas del framework de rieles, pero no las mías personalizadas.Prueba ActiveSupport :: Notificaciones con rspec

it 'sends a "product.search" notification to any subscribers listening' 
    ActiveSupport::Notifications.should_receive(:instrument).with("product.search", :search => search) 
    get :search, ... 
end 

Si cambio de la especificación para comprobar el resultado del código del abonado (por ejemplo, registro de cambio recuento cuando se crea un registro DB) a su paso. Eso confirma que está funcionando bien. Pero, parece incorrecto especificar lo que hace el suscriptor aquí, solo quiero especificar que la notificación se está enviando. Cualquier pensamiento sería apreciado.

EDIT:

Aquí es el código del controlador que estoy tratando a las especificaciones:

ActiveSupport::Notifications.instrument("product.search", :search => 'test') 
+0

es su etiqueta 'rpsec' un error tipográfico? [Probablemente la intención 'rspec'?] – Shad

Respuesta

2

yo era incapaz de lograr la prueba usando una :get acción regular, algo que debería interferir de alguna manera y solo se activan las notificaciones start_processing y process_action. Supongo que ha sido desactivado por el bien del rendimiento.

Pero esto funciona correctamente:

it 'sends a "product.search" notification to any subscribers listening' 
    ActiveSupport::Notifications.should_receive(:instrument).with("product.search", :search => "test") 
    controller.index 
end 
5

que tenían el mismo problema y escribió el siguiente método de ayuda rspec a continuación:

def notification_payload_for(notification) 
    payload = nil 
    subscription = ActiveSupport::Notifications.subscribe notification do |name, start, finish, id, _payload| 
     payload = _payload 
    end 

    yield 

    ActiveSupport::Notifications.unsubscribe(subscription) 

    return payload 
    end 

De esta manera, lo puedo usar de la siguiente manera:

it "should raise the my_notification_name notification" do 
    payload = notification_payload_for('my_notification_name') do 
     # do stuff that should raise the proper notification 
    end 

    # test to see that the payload has the correct info 
    end 
Cuestiones relacionadas