rspec for Delayed_job

时间:2011-03-19 02:09:22

标签: ruby-on-rails ruby-on-rails-3 rspec delayed-job rspec2

我正在尝试为延迟工作写一个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 个答案:

答案 0 :(得分:2)

您在控制器中错误地排队工作。 perform由工人召集,而不是由你召集。

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

同样,请勿在您的规范中调用perform,这就是work_off所做的。

规范的结构应为:

  • 对作业进行排队的访问控制器方法
  • 告诉DelayedJob解决队列问题
  • 检查它是否做了它应该做的事情

我不确定be_worked_on的位置,因为worked_on?未在DelayedJob中的任何位置定义(事实上,这是导致错误的原因)。我会检查已经完成的事情,比如发送邮件,或者你的工作应该做什么。