我正在尝试为延迟工作写一个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
想法?感谢
答案 0 :(得分:2)
您在控制器中错误地排队工作。 perform
由工人召集,而不是由你召集。
Delayed::Job.enqueue MailingJob.new(@incoming_mail.id)
同样,请勿在您的规范中调用perform
,这就是work_off
所做的。
规范的结构应为:
我不确定be_worked_on
的位置,因为worked_on?
未在DelayedJob中的任何位置定义(事实上,这是导致错误的原因)。我会检查已经完成的事情,比如发送邮件,或者你的工作应该做什么。