2011-06-15 17 views
21

बस यह सोचने के लिए कि एक्शनमेलर अनुरोधों का परीक्षण कैसे किया जाता है वास्तव में rspec में देरी_job que को भेजा जाता है।रेल/रुपेक: परीक्षण देरी_job मेल

मुझे लगता है कि यह काफी सरल था, लेकिन मेरी देरी_job कतार बढ़ती प्रतीत नहीं होती है। नीचे दिए गए कोड:

नियंत्रक:

def create 
    @contact = Contact.new(params[:contact]) 
     if @contact.save 
     contactmailer = ContactMailer 
     contactmailer.delay.contact_message(@contact) 
     redirect_to(contacts_url) 
     else 
     render :action => "new" 
     end 

युक्ति:

it "queues mail when a contact is created" do 
    expectedcount = Delayed::Job.count + 1 
    Contact.stub(:new).with(mock_contact()) { mock_contact(:save => true) } 
    post :create, :contact => mock_contact 
    expectedcount.should eq(Delayed::Job.count) 
    end 

दोनों से पहले और नियंत्रक करने के लिए बुलाया गया, विलंबित :: Job.count रिटर्न 0. मैं लेने की कोशिश की है नियंत्रक के सशर्त आउट, लेकिन मुझे अभी भी देरी की नौकरी की गणना में वृद्धि नहीं हो सकती है।

किसी भी सराहना सुझाव - जयकार

उत्तर

45

आप यह भी जांच सकते हैं कि उन्हें चलाने या कतार बंद करने से नौकरियां क्या करेंगे।

जब चाहें ट्वीक कॉन्फ़िगर करें (यानी before :each ब्लॉक में)।

Delayed::Worker.delay_jobs = false 

या प्रदर्शन आपकी सहेजी गई नौकरियों

Delayed::Worker.new.work_off.should == [1, 0] 

मैं थोड़ी देर के लिए खुशी से इस पद्धति का उपयोग किया गया है। एक बात के लिए, आरएसपीईसी में नए any_instance समर्थन का उपयोग करके, आप सीधे देरी के तरीकों के प्रभावों का परीक्षण कर सकते हैं। हालांकि, मुझे ऐसे परीक्षण मिले हैं जो work_offधीमी होने के लिए उपयोग करते हैं।

क्या मैं आमतौर पर अब क्या है:

mock_delay = double('mock_delay').as_null_object 
MyClass.any_instance.stub(:delay).and_return(mock_delay) 
mock_delay.should_receive(:my_delayed_method) 

तब मैं my_delayed_method के लिए एक अलग कल्पना की है। यह बहुत तेज है, और शायद बेहतर इकाई परीक्षण अभ्यास - विशेष रूप से नियंत्रकों के लिए। यद्यपि आप अनुरोध चश्मा या अन्य एकीकरण-स्तर चश्मा कर रहे हैं, तो आप शायद work_off का उपयोग करना चाहते हैं।

+0

मैं इस तरह से पसंद है। ध्यान दें कि पूर्णता के लिए आपको भी (अलग से) परीक्षण करना चाहिए कि देरी की नौकरियों में देरी की नौकरियां शामिल हो रही हैं। – brittohalloran

+1

यह चालाक है - धन्यवाद! – jpwynn

16

मुझे लगता है कि अपने नकली वस्तु किसी भी तरह एक त्रुटि पेश कर रहा है - यह mock_contact विधि की परिभाषा देखे बिना कैसे वास्तव में बताने के लिए मुश्किल है।

किसी भी मामले में, आप इन पंक्तियों के साथ कुछ कोशिश कर सकते हैं:

it "queues mail when a contact is created" do 
    Contact.stub(:new) { mock_model(Contact,:save => true) } 
    Delayed::Job.count.should == 0 
    post :create, {} 
    Delayed::Job.count.should == 1 
    end 

या sexier संस्करण (चेतावनी: मैं हमेशा यह गैर सेक्सी रास्ता कर अंत):

it "queues mail when a contact is created" do 
    Contact.stub(:new) { mock_model(Contact,:save => true) } 
    expect { 
     post :create, {} 
    }.to change(Delayed::Job.count).by(1) 
    end 
8

तुम भी

ActionMailer::Base.deliveries.last.to.should == user.email 

की (Railscast 275 से) का पालन कर सकते हैं, लेकिन इसके बजाय ऐसा करते हैं:

Delayed::Job.last.handler.should have_content(user.email) 
0

यह धागा थोड़ा पुराना है, लेकिन यहाँ यह मेरी जाने है:

एक समारोह बनाएं expect_jobs

def expect_jobs n, time = nil 
    expect(Delayed::Job.count).to eq(n) 
    Timecop.travel(time) unless time.nil? 
    successes, failures = Delayed::Worker.new.work_off 
    expect(successes).to eq(n) 
    expect(failures).to eq(0) 
    expect(Delayed::Job.count).to eq(0) 
    Timecop.travel(Time.now) unless time.nil? 
end 

फिर कॉलबैक ने अपना काम किया है या नहीं, यह जांचने से पहले इसे कॉल करें। उदाहरण के लिए:

it "sends a chapter to the admin user" do 
    post :chapter_to_user, { chapter: @book.chapters.first} 
    expect_jobs(1) 
    SubscribeMailer.should have(1).delivery 
    SubscribeMailer.deliveries.should have(1).attachment 
end 

यह मेरी तरफ पर काम करने लगता है, और मुझे दोनों मेरे देरी नौकरियों और मेरी तरीकों को चलाने के लिए अनुमति देता है।

1

@zetetic मुझे लगता है कि हमें यहां परिवर्तन विधि में ब्लॉक पास करना होगा।

यह इस तरह होना shoulb:

it "queues mail when a contact is created" do 
Contact.stub(:new) { mock_model(Contact,:save => true) } 
expect { 
    post :create, {} 
    }.to change { Delayed::Job.count }.by(1) 
end