【问题标题】:rspec for Delayed_jobDelayed_job 的 rspec
【发布时间】:2011-07-18 14:08:58
【问题描述】:

我正在尝试为延迟工作编写 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

想法?谢谢

【问题讨论】:

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


    【解决方案1】:

    您在控制器中错误地排队您的工作。 perform 是工作人员调用的,不是你调用的。

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

    同样,不要在规范中调用 performwork_off 就是这样做的。

    规范的结构应该是这样的:

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

    我不确定 be_worked_on 的来源,因为 worked_on? 在 DelayedJob 中的任何地方都没有定义(实际上,这是您的错误的原因)。相反,我会检查是否完成了某些事情,例如发送了一封邮件,或者您的工作应该做的任何事情。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2014-10-30
      • 2013-03-05
      • 2011-06-18
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2013-01-28
      相关资源
      最近更新 更多