rspec中未处理延迟作业

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测试相同的线程中)并返回两个数字:成功的作业数和失败的作业数.我目前使用这种方法,它可以完成我需要的一切.

  • 你的答案很聪明,完整且有据可查:).谢谢,你已经度过了我的一天:) (6认同)
  • 语法不太正确,没有[]围绕成功和失败分配`成功,失败=延迟:: Worker.new.work_off` (2认同)

Jes*_*ott 3

过去,我尝试过对逻辑 -> 延迟作业 -> 执行作业进行端到端测试,但事情太多了。我认为您可以专注于测试每个方面,而不是使用 RSpec 来测试完整的甜蜜。

因此,测试作业是否已插入。然后,进行另一个测试来测试执行作业时会发生什么。

或者,模拟延迟作业,以便当您将作业排入队列时,它会立即执行它。