我正在尝试为自定义延迟作业 (GetPage::GetPageJob) 运行 rspecs,但我遇到了问题。
当我运行它们时,这些作业被很好地排入队列(也就是说,很好地插入到了delayed_jobs 表中),但它们没有被作业 worker 处理。
实际上,在第一个终端中启动“rake jobs:work RAILS_ENV=test”,并在第二个终端中运行规范后,我在第一个终端中看不到作业 worker 的任何输出。
另一方面,如果我通过“脚本/控制台测试”将它们排入队列,这些作业就会得到很好的处理。
所以我有点困惑。
使用规范和脚本/控制台,我用来排队我的工作的行是:
Delayed::Job.enqueue GetPage::GetPageJob.new("http://cnn.com")
任何的想法 ?
最佳答案
在 RSpec 中测试排队的 Delayed::Job 任务的最简单方法是实时运行它们。只需将以下行添加到您的 RSpec 测试中:
Delayed::Worker.delay_jobs = false
这将导致您的作业在排队时立即处理,而不是在单独的线程中。这通常是您想要测试的内容,因为它是确定性的。
两个警告
Delayed::Worker.delay_jobs
时不会被调用。设置为假。 两种解决方法
如果您需要测试回调 Hook ,我知道两种解决方法:
Delayed::Worker.delay_jobs = false
,在你的测试代码中显式调用DJ的运行机制如下:successes, failures = Delayed::Worker.new.work_off
这将处理作业队列中的任何内容(同样,在与 RSpec 测试相同的线程中)并返回两个数字:成功的作业数和失败的作业数。我目前使用这种方法,它可以满足我的一切需求。
关于ruby-on-rails - rspec 中未处理延迟作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3191900/