2011-03-19 27 views
2

我正在嘗試爲延遲作業編寫rspec。rspec for Delayed_job

目前我使用的是延遲的工作如下:

class IncomingMailsController < ApplicationController 
... 
MailingJob.new(@incoming_mail.id).perform 
... 
end 

然後在/lib/mailing_job.rb:

​​

如何測試與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 

想法?謝謝

回答

2

你正在控制器中錯誤地排隊你的工作。 perform由工作人員調用,而不是由您調用。

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

同樣,不叫perform在你的天賦,這就是work_off一樣。

規範的結構應該是這樣的:

那排隊工作
  • 訪問控制方法
  • 告訴DelayedJob工作從隊列
  • 檢查,看看它做了什麼,它應該做

我不知道在哪裏be_worked_on進來,因爲worked_on?沒有在任何地方DelayedJob定義(實際上,是落落的原因你的錯誤)。相反,我會檢查一些東西已經完成了,比如發送了一封郵件,或者你的工作應該做什麼。