Jer*_*ome 35 rspec ruby-on-rails delayed-job
我试图为自定义延迟作业(GetPage :: GetPageJob)运行rspecs,但我有一个问题.
当我运行它们时,作业很好地排队(也就是说,插入到delayed_jobs表中),但它们不会被作业工作者处理.实际上,在第一个终端中启动"rake jobs:work RAILS_ENV = test"之后,在第二个终端中运行规范之后,我看不到第一个终端中作业工作者的任何输出.
另一方面,如果我通过"脚本/控制台测试"将作业排入队列,则作业将得到很好的处理.所以我有点困惑.
使用规范和脚本/控制台,我用来排队工作的行是:
Delayed::Job.enqueue GetPage::GetPageJob.new("http://cnn.com")
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
fea*_*ool 94
在RSpec中测试排队的Delayed :: Job任务的最简单方法是实时运行它们.只需在RSpec测试中添加以下行:
Delayed::Worker.delay_jobs = false
Run Code Online (Sandbox Code Playgroud)
这将导致您的作业在入队时立即处理,而不是在单独的线程中处理.这通常是您想要测试的,因为它是确定性的.
如果您正在尝试测试时序错误,竞争条件等,这种方法将无济于事(因为作业在与RSpec相同的线程中处理)
当前版本的delayed_job(2.1.4)有一个小错误,当Delayed::Worker.delay_jobs设置为false 时,回调挂钩(enqueue,before,success,error,failure)不会被调用.
如果你需要测试回调挂钩我知道两个解决方法:
从github获取最新的master分支.(我没试过,因为我需要一个稳定的版本)
而不是设置Delayed::Worker.delay_jobs = false,在您的测试代码中显式调用DJ的运行机制,如下所示:
successes, failures = Delayed::Worker.new.work_off
这将处理作业队列中的任何内容(同样,在与RSpec测试相同的线程中)并返回两个数字:成功的作业数和失败的作业数.我目前使用这种方法,它可以完成我需要的一切.
过去,我尝试过对逻辑 -> 延迟作业 -> 执行作业进行端到端测试,但事情太多了。我认为您可以专注于测试每个方面,而不是使用 RSpec 来测试完整的甜蜜。
因此,测试作业是否已插入。然后,进行另一个测试来测试执行作业时会发生什么。
或者,模拟延迟作业,以便当您将作业排入队列时,它会立即执行它。
| 归档时间: |
|
| 查看次数: |
10366 次 |
| 最近记录: |