rails perform now job delayed_job_active_record active ruby-on-rails rspec delayed-job

ruby-on-rails - perform - rails delayed_job_active_record



Trabajo retrasado no procesado en rspec (4)

En el pasado, traté de hacer una prueba integral de lógica -> trabajo retrasado -> realizar trabajo, y era demasiadas cosas. Creo que en lugar de probar ese dulce completo con RSpec, podrías concentrarte en probar cada aspecto.

Por lo tanto, prueba que un trabajo se inserta. Luego, tenga otra prueba que pruebe lo que debería suceder cuando se ejecuta un trabajo.

O bien, haga una simulación del trabajo diferido, de modo que cuando enquegue un trabajo, lo ejecute de inmediato.

Estoy intentando ejecutar rspecs para un trabajo retrasado personalizado (GetPage :: GetPageJob), pero tengo un problema.

Cuando los ejecuto, los trabajos están bien en cola (es decir, bien insertado en la tabla de retardo_jobs), pero no son procesados ​​por el trabajador del trabajo. De hecho, después de lanzar "trabajos de rastreos: trabajo RAILS_ENV = prueba" en un primer terminal, y después de ejecutar las especificaciones en un segundo terminal, no veo ningún resultado del trabajador del trabajo en el primer terminal.

Por otro lado, los trabajos están bien procesados ​​si los pongo en cola a través de "script / console test". Entonces estoy un poco confundido.

Con las especificaciones y el script / consola, la línea que uso para poner en cola mis trabajos es:

Delayed::Job.enqueue GetPage::GetPageJob.new("http://cnn.com")

Alguna idea ?


La forma más sencilla de probar las tareas retrasadas :: Job en cola en RSpec es ejecutarlas en tiempo real. Simplemente agregue la siguiente línea a sus pruebas de RSpec:

Delayed::Worker.delay_jobs = false

Esto hará que sus trabajos se procesen inmediatamente después de enquear, no en un hilo separado. Esto es generalmente lo que quiere para probar, ya que es determinista.

Dos advertencias

  • Si está intentando evaluar los errores de sincronización, las condiciones de carrera, etc., este enfoque no ayudará (ya que los trabajos se procesan en el mismo hilo que RSpec)

  • La versión actual de delayed_job (2.1.4) tiene un error menor en el que los enganches de devolución de llamada (en cola, antes, éxito, error, falla) no se llaman cuando Delayed::Worker.delay_jobs se establece en falso.

Dos soluciones

Si necesita probar los enlaces de devolución de llamada sé de dos soluciones:

  • Obtenga la última rama maestra de github. (No lo he intentado porque necesito una versión estable)

  • En lugar de configurar Delayed::Worker.delay_jobs = false , llame explícitamente al mecanismo de ejecución de DJ en su código de prueba de la siguiente manera:

    successes, failures = Delayed::Worker.new.work_off

Eso procesará todo lo que esté en la cola de trabajos (nuevamente, en el mismo hilo que las pruebas de RSpec) y devolverá dos números: el número de trabajos que tuvieron éxito y el número de trabajos que fallaron. Actualmente uso este enfoque y hace todo lo que necesito.


Tendrá que iniciar el proceso de trabajo desde dentro de sus pruebas en lugar de desde otro proceso. Tratar:

worker = Delayed::Worker.new(:max_priority => nil, :min_priority => nil, :quiet => true) worker.work_off


Utilizo la opción de configuración para ejecutar los trabajos en tiempo real:

# config/initializers/delayed_job_config.rb Delayed::Worker.delay_jobs = !Rails.env.test?