2011-08-16 14 views
5

Me gustaría verificar que se llame a los ganchos de devolución de llamada de delay_job, pero no veo cómo hacer que RSpec lo haga, especialmente cuando se trata de varias capas de clases.cómo probar los ganchos de devolución de llamada de delayyed_job utilizando RSpec

Suponiendo que tengo un modelo ActiveRecord como esto:

class MyJob < ActiveRecord::Base 
    def perform 
    # do some stuff 
    end 
    def after(job) 
    # called by delayed_job after perform completes 
    end 
end 

Conceptualmente, quiero una prueba RSpec lo largo de estas líneas (aunque sé que esto no es correcto):

it 'should call the :after callback hook' do 
    my_job = MyJob.create 
    my_job.should_receive(:after).with(an_instance_of(Delayed::Backend::ActiveRecord::Job)) 

    Delayed::Job.enqueue(my_job) 
    Delayed::Worker.new.work_off 
end 

He estudiado minuciosamente el stackoverflow, relishapp.com/rspec y todos los otros lugares en los que puedo pensar. No puede ser muy difícil, ¿verdad? (Apuesto a que @zetetic sabe la respuesta en su sueño ...;)

(Advertencia: Mi caso real utiliza una clase 'shim' entre MyJob y DJ. Una respuesta para este caso simple puede desencadenar un seguimiento más complejo -on!)

+0

Si solo busca verificar que se llame 'after', couldn ' t soltar el requisito '.with (an_instance_of ...'? Como nota al margen, tiendo a utilizar Delayed :: Worker.new (: quiet => true) .work_off para silenciar al trabajador y cualquier lloriqueo que pueda Sí. Lo admito, podría haber una excepción que no veo por eso. – Nick

Respuesta

1

en mi humilde opinión, no creo que esto es lo mejor que puede hacer ...

Al hacer esto, usted está tratando a las especificaciones de comportamiento DelayedJob, no su aplicación, y DJ ya cuenta con su propio juego de pruebas.

De todos modos, ¿qué hay de burlarse de DelayedJob en sí? Tal vez pueda especificar, haciendo eso, que su MockedJob llamará a su gancho después del procesamiento, y puede crear sus equilibradores/expectativas en consecuencia ...

+0

Después de haber estado alejado de esta cuestión durante más de dos años (!) Creo que estás en lo cierto: la pregunta, tal como está escrita, solo está intentando para verificar el comportamiento de DJ y no está haciendo nada para verificar mi código. –

1

Mi sugerencia sería ver si la tabla de trabajos crea un nuevo registro de trabajo, y luego introspectar los detalles de ese registro. He usado algo como esto en el pasado.

it "should sync content from the remote CMS" do  
    DelayedJobs::CMS::Sync.module_eval do 
    def perform 
    url.should == "http://example.com/tools/datafeed/resorts/all" 
    Report.sync!([{'id' => 1, 'name' => 'resort foo'}]) 
    end 
end 

lambda do 
    Report.sync_all! 
end.should change(Delayed::Job, :count) 

lambda do 
    Delayed::Job.work_off 
end.should change(Resort, :count).by(2) 
end 
Cuestiones relacionadas