rspec для Delayed_job - PullRequest
       11

rspec для Delayed_job

2 голосов
/ 19 марта 2011

Я пытаюсь написать 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 Ответ

2 голосов
/ 20 марта 2011

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

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

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

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

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

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

...