Я хотел бы убедиться, что перехватчики обратного вызова 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. Ответ на этот простой случай может вызвать более сложное продолжение!)
after
, не могли бы вы отказаться от требования.with(an_instance_of...
? В качестве примечания, я предпочитаю использовать Delayed::Worker.new(:quiet =› true).work_off, чтобы заглушить воркер и любое его нытье. Я признаю, однако, что может быть исключение, которое я не вижу из-за этого. - person Nick   schedule 23.09.2011