rspec для Delayed_job
Я пытаюсь написать rspec для отложенной работы.
В настоящее время я использую отложенную работу следующим образом:
class IncomingMailsController < ApplicationController
...
MailingJob.new(@incoming_mail.id).perform
...
end
Затем в /lib/mailing_job.rb:
class MailingJob < Struct.new(:mailing_id)
def perform
.......
Как я могу проверить это с помощью rspec? Прямо сейчас у меня есть:
/spec/lib/mailing_job/mailingjob_spec.rb
require 'spec_helper'
describe MailingJob do
include DelayedJobSpecHelper
it "should have been worked on if I do something that queues jobs" do
@incoming_mail = IncomingMail.create(.........)
MailingJob.new(@incoming_mail.id).perform
#IncomingMail.method_that_queues_jobs
work_off
MailingJob.should be_worked_on
end
end
/spec/lib/delayed_job_spec_helper.rb
module DelayedJobSpecHelper
# http://erikonrails.snowedin.net/?p=230
def work_off
Delayed::Job.all.each do |job|
job.payload_object.perform
job.destroy
end
end
end
Но это ошибки с:
1) MailingJob should have been worked on if I do something that queues jobs
Failure/Error: MailingJob.should be_worked_on
NoMethodError:
undefined method `worked_on?' for MailingJob:Class
# ./spec/lib/mailing_job/mailingjob_spec.rb:19
Идеи? Спасибо
1 ответ
Вы неправильно ставите свою очередь в диспетчере. perform
вызывается работником, а не вами.
Delayed::Job.enqueue MailingJob.new(@incoming_mail.id)
Точно так же не звоните perform
в вашей спецификации, вот что work_off
делает.
Структура спецификации должна быть такой:
- Метод контроллера доступа, который ставит в очередь задание
- Скажите DelayedJob отработать очередь
- Убедитесь, что он сделал то, что должен был сделать
Я не уверен где be_worked_on
приходит, как worked_on?
не определено нигде в DelayedJob (и действительно, является причиной вашей ошибки). Вместо этого я бы проверил, что-то было сделано, например, отправлено письмо или что-то еще, что ваша работа должна делать.