使用 rSpec 测试延迟作业链的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 rSpec 测试延迟作业链的最佳方法是啥?【英文标题】:What's the best way to test delayed_job chains with rSpec?使用 rSpec 测试延迟作业链的最佳方法是什么? 【发布时间】:2011-10-25 05:59:35 【问题描述】:

目前,当我的代码中有一个延迟方法时,如下所示:

CommentMailer.delay.deliver_comments(@comment, true)

我在我的规范中写了这样的内容:

dj = mock("DelayProxy")
CommentMailer.should_receive(:delay).and_return(dj)
dj.should_receive(:deliver_comments).with(comment, true)

一般来说,有没有更好的方法来处理这个和/或类似 rSpec 中的链式方法?

【问题讨论】:

【参考方案1】:

我们可以在 before 块中再增加一行,如下所示:

CommentMailer.stub(:delay).and_return(CommentMailer)

然后你就可以进行正常的模拟检查了:

CommentMailer.should_receive(:deliver_comments).with(comment, true)

【讨论】:

使用 rspec-mocks 的旧 :should 语法中的 stub 而不显式启用该语法在 rspec-3 中已弃用。这似乎工作expect(CommentMailer).to receive(:delay).and_return(CommentMailer)。如果您不想显式测试它,可以使用allow 而不是expect【参考方案2】:

以下是一些关于 rSpec 中的链接方法的讨论,我发现它们很有帮助:

Stubbing Chained Methods with Rspec

http://groups.google.com/group/rspec/browse_thread/thread/6b8394836d2390b0#

【讨论】:

【参考方案3】:
describe '#perform' do
    subject do
      Delayed::Worker.delay_jobs = false
      proc  worker.perform() 
    end

    it  is_expected.to change  ActionMailer::Base.deliveries.length .by(2) 
  end

将延迟作业设置为 false,您可以像简单一样对其进行测试

【讨论】:

以上是关于使用 rSpec 测试延迟作业链的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Rails/Rspec:测试延迟作业邮件

在 RSpec 请求规范中使用 Capybara 时设置自定义请求标头的最佳方法是啥?

postgres 上的这个延迟作业查询的最佳索引是啥?

rspec 中未处理延迟作业

将已解决的承诺值传递到最终的“then”链的最佳方法是啥[重复]

在 Delphi 中编程延迟的最佳方法是啥?