【发布时间】:2011-10-27 17:57:54
【问题描述】:
我想验证是否调用了延迟作业回调挂钩,但我不知道如何让 RSpec 执行此操作,尤其是在涉及多层类时。
假设我有一个这样的 ActiveRecord 模型:
class MyJob < ActiveRecord::Base
def perform
# do some stuff
end
def after(job)
# called by delayed_job after perform completes
end
end
从概念上来说,我想要按照这些思路进行 RSpec 测试(尽管我知道这不正确):
it 'should call the :after callback hook' do
my_job = MyJob.create
my_job.should_receive(:after).with(an_instance_of(Delayed::Backend::ActiveRecord::Job))
Delayed::Job.enqueue(my_job)
Delayed::Worker.new.work_off
end
我仔细研究了 stackoverflow、relishapp.com/rspec 以及我能想到的所有其他地方。不会太难吧? (我敢打赌@zetetic 会在睡梦中知道答案……;)
(警告:我的实际案例在 MyJob 和 DJ 之间使用了一个“shim”类。这个简单案例的答案可能会引发更复杂的后续操作!)
【问题讨论】:
-
如果您只想验证
after是否被调用,您不能放弃.with(an_instance_of...要求吗?作为旁注,我倾向于使用 Delayed::Worker.new(:quiet => true).work_off 来让工作人员和它可能发出的任何抱怨保持沉默。不过我承认,可能有一个我没有看到的例外。
标签: ruby-on-rails rspec delayed-job