2011-08-16 53 views
5

我想驗證的是delayed_job回調掛鉤正在調用,但我不明白如何讓RSpec來做到這一點,特別是涉及幾層類時。如何使用RSpec測試delayed_job回調掛鉤

假設我有一個ActiveRecord模型是這樣的:

class MyJob < ActiveRecord::Base 
    def perform 
    # do some stuff 
    end 
    def after(job) 
    # called by delayed_job after perform completes 
    end 
end 

概念,我想沿着這些線路一個RSpec測試(雖然我知道這是不正確的):

it 'should call the :after callback hook' do 
    my_job = MyJob.create 
    my_job.should_receive(:after).with(an_instance_of(Delayed::Backend::ActiveRecord::Job)) 

    Delayed::Job.enqueue(my_job) 
    Delayed::Worker.new.work_off 
end 

我已經注意到了stackoverflow,relishapp.com/rspec和我能想到的所有其他地方。它不能太難,對吧? (我打賭@zetetic在睡夢中知道答案......)

(警告:我的實際案例在MyJob和DJ之間使用了'shim'類,這個簡單案例的答案可能觸發更復雜的跟隨-on!)

+0

如果你正在尋找只調用''之後',couldn'作爲一個方面說明,我傾向於使用Delayed :: Worker.new(:quiet => true).work_off來使工作人員保持沉默,並且可能會發出任何嗚嗚聲我承認雖然可能有一個例外,我沒有看到因爲這個 – Nick

回答

1

恕我直言,我不認爲這是最好的事情...

通過這樣做,你要符合規範DelayedJob的行爲,而不是你的應用程序,和DJ已經擁有了自己測試套裝。

無論如何,嘲笑DelayedJob本身呢?也許你可以這樣做,指定你的MockedJob會在處理後調用你的鉤子,並且你可以相應地創建你的匹配器/期望...

+0

已經離開這個問題超過兩年(!)我認爲你是正確的:這個問題,正如書面,只是試圖驗證DJ的行爲,並沒有做任何事情來驗證我的代碼。 –

1

我的建議是查看Jobs表是否創建新的工作記錄,然後反思該記錄的詳細信息。我過去曾經使用過類似的東西。

it "should sync content from the remote CMS" do  
    DelayedJobs::CMS::Sync.module_eval do 
    def perform 
    url.should == "http://example.com/tools/datafeed/resorts/all" 
    Report.sync!([{'id' => 1, 'name' => 'resort foo'}]) 
    end 
end 

lambda do 
    Report.sync_all! 
end.should change(Delayed::Job, :count) 

lambda do 
    Delayed::Job.work_off 
end.should change(Resort, :count).by(2) 
end