未在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?