Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rspec中未处理延迟作业_Ruby On Rails_Rspec_Delayed Job - Fatal编程技术网

Ruby on rails rspec中未处理延迟作业

Ruby on rails rspec中未处理延迟作业,ruby-on-rails,rspec,delayed-job,Ruby On Rails,Rspec,Delayed Job,我正在尝试为自定义延迟作业(GetPage::GetPageJob)运行rspecs,但遇到问题 当我运行它们时,作业被很好地排队(也就是说,很好地插入到delayed_jobs表中),但它们没有被作业工作者处理。 事实上,在第一个终端中启动“rake jobs:work RAILS_ENV=test”之后,在第二个终端中运行规范之后,我在第一个终端中看不到作业工人的任何输出 另一方面,如果我通过“脚本/控制台测试”将作业排入队列,那么这些作业会得到很好的处理。 所以我有点困惑 对于规范和脚本/

我正在尝试为自定义延迟作业(GetPage::GetPageJob)运行rspecs,但遇到问题

当我运行它们时,作业被很好地排队(也就是说,很好地插入到delayed_jobs表中),但它们没有被作业工作者处理。 事实上,在第一个终端中启动“rake jobs:work RAILS_ENV=test”之后,在第二个终端中运行规范之后,我在第一个终端中看不到作业工人的任何输出

另一方面,如果我通过“脚本/控制台测试”将作业排入队列,那么这些作业会得到很好的处理。 所以我有点困惑

对于规范和脚本/控制台,我用于将作业排队的行是:

Delayed::Job.enqueue GetPage::GetPageJob.new("http://cnn.com")

有什么想法吗?

过去,我试着做一个逻辑->延迟作业->执行作业的端到端测试,结果太多了。我认为,与其使用RSpec测试全甜,不如将重点放在测试每个方面

所以,测试是否插入了作业。然后,进行另一个测试,测试在执行作业时应该发生什么


或者,模拟延迟的作业,这样当您将作业排队时,它会立即执行它。

您需要从测试内部启动工作进程,而不是从另一个进程启动工作进程。尝试:

worker = Delayed::Worker.new(:max_priority => nil, :min_priority => nil, :quiet => true)
worker.work_off

在RSpec中测试队列延迟::作业任务的最简单方法是实时运行它们。只需在RSpec测试中添加以下行:

Delayed::Worker.delay_jobs = false
这将导致在排队时立即处理作业,而不是在单独的线程中。这通常是测试所需的,因为它是确定性的

两个警告
  • 如果您试图测试计时错误、竞争条件等,这种方法将不会有帮助(因为作业与RSpec在同一线程中处理)

  • 当前版本的delayed_作业(2.1.4)存在一个小错误,即当
    delayed::Worker时,不会调用回调挂钩(排队、之前、成功、错误、失败)。delayed_作业
    设置为false

两个变通办法 如果需要测试回调挂钩,我知道有两种解决方法:

  • 从github获取最新的主分支。(我没有试过,因为我需要一个稳定的版本)

  • 不要设置
    Delayed::Worker.delay_jobs=false
    ,而是在测试代码中显式调用DJ的运行机制,如下所示:

    成功,失败=延迟::Worker.new.work\u off


这将处理作业队列中的任何内容(同样,与RSpec测试在同一线程中),并返回两个数字:成功的作业数和失败的作业数。我目前使用这种方法,它可以完成我需要的一切。

我使用配置选项实时运行作业:

# config/initializers/delayed_job_config.rb
Delayed::Worker.delay_jobs = !Rails.env.test?

你的答案非常聪明、完整并且有很好的记录:)。谢谢,你让我高兴了:)试一试怎么样?你是如何测试的?@oma:也许我误解了你的意思,但是[Successfulls,failures]返回值考虑了:尝试次数:在尝试次数超过之前,作业实际上不会失败。我不想高举此线程。也许我会写一个问题。我正在为每个作业设置最大尝试次数,实现方法错误和重新安排(DJ使用响应来寻找?)。我很难测试它是否有更多的尝试…语法不太正确,没有[]关于分配的成功和失败
successfuls,failures=Delayed::Worker.new.work\u off
我发现你的最后一句话很有用;我只是简单地这样做,例如,
UserMailer.stub(delay:UserMailer)
obj.stub(delay:obj)
,我的测试愉快地进行着。而在config
Delayed::Worker.delay\u jobs=中执行此操作的建议!Rails.env.in.(['development','test'])
也可以,我有一大堆遗留测试正在测试延迟的作业本身,我现在不想更新这些作业。谢谢