2012-03-27 7 views
8

मैं एक ActionMailer वर्गActionMailer विधि मॉड्यूल में नहीं के बराबर लौटने जबकि rspec परीक्षण

class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 

    def submission_reminder user 
    @user = user   
    mail :to => user.email, :subject => "Your timesheet needs to be submitted!" 
    end  
end 

है, तो मैं फोन UserMailer.submission_reminder(current_user) विकास में यह मुझे देता है एक Mail::Message वस्तु की उम्मीद की तरह कॉल।

जहां इस विधि कहा जाता है अपने आवेदन में जगह एक मॉड्यूल मैं lib फ़ोल्डर में है में है:

module TimesheetSubmissionNotifier        
    def self.send_submission_reminders 
    User.all.each { |user| UserMailer.submission_reminder(user).deliver } 
    end 
end 

जब मैं विकास में TimesheetSubmissionNotifier.send_submission_reminders फोन, UserMailer.submission_remind (उपयोगकर्ता) मेल संदेश देता है और डिलीवरी कहा जाता है, सबकुछ काम करता है जैसा इसे करना चाहिए।

समस्या यह है कि जब मैं TimesheetSubmissionNotifier.send_submission_reminders को एक आरएसपीईसी परीक्षण के माध्यम से कॉल करता हूं, UserMailer.submission_reminder(user) शून्य देता है।

अगर मैं सीधे एक आरएसपीईसी परीक्षण से UserMailer.submission_reminder(user) पर कॉल करता हूं, तो यह अपेक्षित मेलर संदेश देता है।

config.action_mailer.delivery_method = :test 
config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
कोई भी विचार

क्यों विधि लौटा रहा है नहीं के बराबर:

यहाँ केवल मेरी config/पर्यावरण/test.rb में ActionMailer से संबंधित लाइनें हैं?

+0

जब आप किसी आरएसपीईसी परीक्षण कार्यों से सीधे 'UserMailer.submission_reminder (उपयोगकर्ता)' को कॉल करते हुए कहते हैं, तो आप विधि में पास ** उपयोगकर्ता ** ऑब्जेक्ट को कैसे प्रारंभ कर रहे हैं? आप इसे उपयोगकर्ता तालिका से प्राप्त करते हैं या आप इसे फैक्ट्री आदि के साथ बनाते हैं? – Zheileman

उत्तर

16

जिनके पास समान समस्या है, मुझे समस्या मिली।

मैं should_receive आरएसपीसी उम्मीद का उपयोग कर रहा था, जिसे मैंने वास्तव में महसूस नहीं किया था कि वास्तव में उस कक्षा का एक नकली बनाया गया है। तो मैं पूरी तरह से UserMailer क्लास का मज़ाक उड़ा रहा था जिसका मतलब था कि यह कभी भी वास्तविक UserMailer क्लास तक नहीं पहुंच रहा था।

मैं इसे नकली कार्यों का उपयोग करके काम नहीं कर सका, इसलिए मैंने UserMailer.deliveries स्टोर को देखने के लिए अपना परीक्षण बदल दिया और जांच की कि सही मात्रा में संदेश डाले गए हैं और उन्हें दाईं ओर भेजा जा रहा है ईमेल पता।

+1

हाँ मैंने यह भी किया है, Google उदाहरण के लिए एक आसान है जो यह करता है। यह चेतावनी देने योग्य है कि यह परीक्षण करने के लिए यह एक बहुत ही गलत * तरीका है। Should_receive एक विधि अंतराल का मज़ाक उड़ा रहा है, लेकिन किसी भी प्रकार के रिटर्न वैल्यू को परिभाषित नहीं करता है जब तक कि आप यह स्पष्ट रूप से नहीं करते (प्राप्त करने के पास ई-मेल प्राप्त करने के साथ कुछ भी नहीं है ;-))। –

+1

तकनीकी रूप से, should_receive एक नकली वस्तु नहीं बनाता है, यह विधि को रोकता है और शून्य देता है (rspec दस्तावेज़ इसे आंशिक नकली के रूप में संदर्भित करता है)। आप मूल विधि से and_call_original के साथ कॉल कर सकते हैं। जैसे। should_receive (: submitted_reminder) .and_call_original –

+3

हम रेलों के लिए इस अपग्रेडिंग में भाग गए थे। हम साइडकीक विलंब का उपयोग कर रहे थे जो कि रनरइम एरर को बढ़ाने के लिए अपग्रेड के दौरान बदल गया था, अगर मेलर शून्य लौटाता है तो 'एक अविश्वसनीय मेल ऑब्जेक्ट वापस कर दिया जाता है'। Mailer.should_receive (: submitted_reminder) .and_call_original परीक्षणों को ठीक किया गया। –