2011-08-16 10 views
5

का उपयोग कर हुक मैं चाहूँगा कि delayed_job कॉलबैक हुक कहा जाता हो रहे हैं सत्यापित करने के लिए है, लेकिन मैं कैसे RSpec यह करने के लिए, खासकर जब कक्षाओं की कई परतों शामिल कर रहे हैं पाने के लिए नहीं दिख रहा।कैसे delayed_job परीक्षण करने के लिए कॉलबैक RSpec

मान लिया जाये कि मैं इस तरह एक 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 

मैंने स्टैक ओवरफ्लो, relishapp.com/rspec और अन्य सभी स्थानों पर लगाया है जिन पर मैं सोच सकता हूं। यह बहुत कठिन नहीं हो सकता है, है ना? (मैं शर्त लगाता हूं कि @zetetic उसकी नींद में जवाब जानता है ...;)

(चेतावनी: मेरा वास्तविक मामला माईजोब और डीजे के बीच 'शिम' वर्ग का उपयोग करता है। इस साधारण मामले का उत्तर अधिक जटिल अनुवर्ती हो सकता है -ऑन!)

+0

आप केवल सत्यापित करने के लिए 'after' कहा जाता है देख रहे हैं, नहीं कर सके ' किसी भी शिकायत शांत => true) और कार्यकर्ता मौन करने .work_off वह: आप '.with (an_instance_of ...' आवश्यकता ड्रॉप नहीं की जाती है एक तरफ ध्यान दें के रूप में, मैं उपयोग करने के लिए विलंबित :: Worker.new (करते हैं मैं मानता हूं कि, एक अपवाद हो सकता है जिसके कारण मैं इसे देख नहीं रहा हूं। – Nick

उत्तर

1

IMHO मुझे नहीं लगता है यह करने के लिए सबसे अच्छी बात है ...

ऐसा करने से, आप DelayedJob के व्यवहार, आपका ऐप्लिकेशन नहीं, और डीजे विशिष्ट जानकारी के अनुसार पहले से कोई है कोशिश कर रहे हैं परीक्षण के सूट।

वैसे भी, DelayedJob ही मजाक के बारे में क्या? हो सकता है कि आपको लगता है कि कर रही है, कि अपने MockedJob प्रसंस्करण के बाद अपने हुक फोन करेगा द्वारा निर्दिष्ट कर सकते हैं, और आपको उसके अनुसार matchers/उम्मीदों बना सकते हैं ...

+0

इस प्रश्न से दो साल से दूर होने के बाद (!) मुझे लगता है कि आप सही हैं: प्रश्न, जैसा लिखा है, केवल कोशिश कर रहा है डीजे के व्यवहार को सत्यापित करने के लिए और मेरे कोड को सत्यापित करने के लिए कुछ भी नहीं कर रहा है। –

1

मेरा सुझाव यह देखना होगा कि जॉब्स टेबल एक नया जॉब रिकॉर्ड बनाता है, और फिर उस रिकॉर्ड के विवरण का निरीक्षण करता है। मैंने अतीत में ऐसा कुछ इस्तेमाल किया है।

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 
संबंधित मुद्दे