Как проверить перехват обратных вызовов delayed_job, используя RSpec - PullRequest
5 голосов
/ 16 августа 2011

Я бы хотел убедиться, что перехватываются обратные вызовы 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

Концептуально , я хочу провести тест 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 знает ответ во сне ...;)

(Предостережение: Мой реальный случай использует класс shim между MyJob и DJ. Ответ на этот простой случай может вызвать более сложное продолжение!)

Ответы [ 2 ]

1 голос
/ 14 мая 2012

ИМХО, я не думаю, что это лучшее, что можно сделать ...

Делая это, вы пытаетесь определить поведение DelayedJob, а не свое приложение, и у DJ уже есть свой набор тестов.

В любом случае, как насчет насмешки над самой DelayedJob? Может быть, вы можете указать, таким образом, что ваш MockedJob будет вызывать ваш хук после обработки, и вы можете создать свои сопоставители / ожидания соответственно ...

1 голос
/ 07 октября 2011

Я бы посоветовал узнать, создает ли таблица «Задания» новую запись о задании, а затем проанализировать детали этой записи. Я использовал что-то подобное в прошлом.

it "should sync content from the remote CMS" do      
  DelayedJobs::CMS::Sync.module_eval do
  def perform
    url.should == "http://example.com/tools/datafeed/resorts/all"
    Report.sync!([{'id' => 1, 'name' => 'resort foo'}])
  end
end

lambda do
  Report.sync_all!
end.should change(Delayed::Job, :count)

lambda do
  Delayed::Job.work_off
end.should change(Resort, :count).by(2)
end
...