未在rspec中处理延迟的作业

我试图运行一个自定义延迟作业(GetPage :: GetPageJob)rspecs,但我有一个问题。

当我运行它们时,这些工作排队很好(也就是说,插入在delayed_jobs表中),但是它们不被工作人员处理。 事实上,在第一个terminal上启动“rake jobs:work RAILS_ENV = test”之后,在第二个terminal上运行规范之后,我看不到第一个terminal上的工作人员的任何输出。

另一方面,如果我通过“脚本/控制台testing”将它们排入队列,这些工作就会得到很好的处理。 所以我有点困惑。

无论是规格还是脚本/控制台,我用来排队工作的线路是:

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

任何想法 ?

在RSpec中testing排队的Delayed :: Job任务的最简单方法是实时运行它们。 只需将以下行添加到您的RSpectesting:

 Delayed::Worker.delay_jobs = false 

这将导致你的工作在排队时立即被处理,而不是在一个单独的线程中。 这通常是你想要testing的,因为它是确定性的。

两个警告

  • 如果您正在尝试testing计时错误,竞争条件等,则此方法将无济于事(因为作业是在与RSpec相同的线程中处理的)

  • 当前版本的delayed_job(2.1.4)有一个小错误,当Delayed::Worker.delay_jobs被设置为false时,callback钩子(入队,之前,成功,错误,失败)不会被调用。

两个解决方法

如果你需要testingcallback挂钩我知道两个解决方法:

  • 从github获取最新的主分支。 (我没有试过,因为我需要一个稳定的版本)

  • 而不是设置Delayed::Worker.delay_jobs = false ,在你的testing代码中显式调用DJ的运行机制,如下所示:

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

这将处理作业队列中的所有内容(再次,在与RSpectesting相同的线程中)并返回两个数字:成功的作业数量和失败的作业数量。 我目前使用这种方法,它做我需要的一切。

在过去,我试图做一个端到端的逻辑testing – >延迟工作 – >执行工作,这是太多的事情。 我认为,而不是使用RSpectesting完全的甜蜜,你可以专注于testing每个方面。

所以,testing一个工作被插入。 然后,再进行一次testing,testing一个作业执行时应该发生什么。

或者,嘲笑延迟工作,这样当你排队工作时,它立即执行。

您需要从testing内部启动工作进程,而不是从另一个进程启动。 尝试:

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

我使用configuration选项来实时运行作业:

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