如何使用RSpec测试delayed_job回调挂钩

fea*_*ool 5 rspec ruby-on-rails delayed-job

我想验证delayed_job回调挂钩是否被调用,但我没有看到如何让RSpec执行它,特别是当涉及几层类时.

假设我有一个像这样的ActiveRecord模型:

class MyJob < ActiveRecord::Base
  def perform
    # do some stuff
  end
  def after(job)
    # called by delayed_job after perform completes
  end
end
Run Code Online (Sandbox Code Playgroud)

从概念上讲,我希望沿着这些方向进行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
Run Code Online (Sandbox Code Playgroud)

我仔细研究了stackoverflow,relishapp.com/rspec以及我能想到的所有其他地方.这不可能太难了吧?(我打赌@zetetic在睡梦中知道答案......;)

(警告:我的实际案例使用MyJob和DJ之间的"垫片"课程.这个简单案例的答案可能会触发更复杂的后续行动!)

小智 1

恕我直言,我不认为这是最好的事情......

通过这样做,您正在尝试规范 DelayedJob 的行为,而不是您的应用程序,并且 DJ 已经有了自己的测试套件。

不管怎样,嘲笑 DelayedJob 本身怎么样?也许您可以通过这样做指定您的 MockedJob 将在处理后调用您的钩子,并且您可以相应地创建匹配器/期望...