ruby-on-rails - rspec 中未处理延迟作业

标签 ruby-on-rails rspec delayed-job

我正在尝试为自定义延迟作业 (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

这将导致您的作业在排队时立即处理,而不是在单独的线程中。这通常是您想要测试的内容,因为它是确定性的。

两个警告
  • 如果您尝试测试计时错误、竞争条件等,这种方法将无济于事(因为作业在与 RSpec 相同的线程中处理)
  • 当前版本的delayed_job (2.1.4) 有一个小错误,其中回调 Hook (入队、之前、成功、错误、失败)在Delayed::Worker.delay_jobs 时不会被调用。设置为假。

  • 两种解决方法

    如果您需要测试回调 Hook ,我知道两种解决方法:
  • 从 github 获取最新的 master 分支。 (我没有尝试过,因为我需要一个稳定的版本)
  • 而不是设置 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/

    相关文章:

    ruby-on-rails - 升级到 Rails 3.2.2 : How to solve the 'undefined method for Syck::DomainType' error related to the Delayed Job gem?

    ruby-on-rails - 无法在 Ubuntu 15.04 上安装 Ruby 2.2.3

    ruby-on-rails - 在 Rails 中以不同语言输入字段值

    ruby-on-rails - 为 Spree 应用编写测试套件

    ruby-on-rails - Rails ActiveRecord 在 after_save 回调中使用最近保存的记录 ID

    ruby-on-rails - 让 Selenium WebDriver 在 RSpec/Rails 中使用 Chrome

    mysql - 当记录在 X 时间内未更新时通知用户

    ruby-on-rails - 如何在 Rails 模型的构造函数中使用参数

    ruby - Rspec 无方法错误

    ruby-on-rails-3 - Delayed_job守护程序未在开发中运行?