使用 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 测试延迟作业链的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 RSpec 请求规范中使用 Capybara 时设置自定义请求标头的最佳方法是啥?