【发布时间】:2012-08-27 21:40:39
【问题描述】:
所以根据我的理解,我相信你这样做
Resque.inline = Rails.env.test?
您的 resque 任务将同步运行。我正在编写一个关于在 after_commit 回调期间排队的 resque 任务的测试。
after_commit :enqueue_several_jobs
#class PingsEvent < ActiveRecord::Base
...
def enqueue_several_jobs
Resque.enqueue(PingFacebook, self.id)
Resque.enqueue(PingTwitter, self.id)
Resque.enqueue(PingPinterest, self.id)
end
在我的 Resque 任务类的 .perform 方法中,我正在执行 Rails.logger.info 并且在我的测试中,我正在执行类似的操作
..
Rails.logger.should_receive(:info).with("PingFacebook sent with id #{dummy_event.id}")
PingsEvent.create(params)
我对@987654328@ 和PingPinterest 进行了相同的测试。
我的第二个和第三个期望都失败了,因为似乎测试实际上在所有 resque 作业运行之前完成。只有第一个测试真正通过。 RSpec 然后抛出一个MockExpectationError 告诉我Rails.logger 没有收到其他两个测试的.info。有人有过这方面的经验吗?
编辑
有人提到should_receive 的行为类似于mock,而我应该改为.exactly(n).times。很抱歉没有早点说清楚,但我对不同的it 块有我的期望,我认为一个it 块中的should_receive 不会在下一个it 块中模拟它?如果我错了,请告诉我。
【问题讨论】:
-
这对你有用吗?
标签: ruby-on-rails rspec resque resque-retry