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

Идеи? Спасибо


person AnApprentice    schedule 19.03.2011    source источник


Ответы (1)


Вы неправильно ставите свою работу в очередь в контроллере. perform вызывается работником, а не вами.

Delayed::Job.enqueue MailingJob.new(@incoming_mail.id)

Точно так же не называйте perform в своей спецификации, это то, что делает work_off.

Структура спецификации должна быть такой:

  • Метод контроллера доступа, который ставит задание в очередь
  • Скажите DelayedJob работать вне очереди
  • Проверьте, сделал ли он то, что должен был сделать.

Я не уверен, где появляется be_worked_on, поскольку worked_on? нигде не определено в DelayedJob (и действительно является причиной вашей ошибки). Вместо этого я бы проверил, было ли что-то сделано, например, письмо было отправлено, или что-то еще, что ваша работа должна делать.

person Robert Speicher    schedule 20.03.2011