2012-03-13 13 views
5

मैं कुछ Rspec कोई है जो कंपनी को छोड़ दिया द्वारा लिखित के माध्यम से पढ़ रहा हूँ में Class.new का लाभ है। मैं इस लाइन के बारे में सोच रहा हूँ:क्या इस Rspec

let(:mailer_class) { Class.new(AxeMailer) } 
    let(:mailer) { mailer_class.new } 

    describe '#check' do 
    before do 
     mailer_class.username 'username' 
     mailer.from '[email protected]' 
     mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

यह इस वर्ग के परीक्षण कर रहा है:

class AxeMailer < AbstractController::Base 

    def self.controller_path 
    @controller_path ||= name.sub(/Mailer$/, '').underscore 
    end 

मैं इस और let(:mailer_class) { AxeMailer } के बीच का अंतर जानना चाहते हैं।

मैं इस पूछना क्योंकि वर्तमान में जब मैं परीक्षण चलाने के लिए, यह शिकायत name नहीं के बराबर है। लेकिन अगर मैंने इसे बदल दिया, तो यह ठीक से परीक्षण करेगा।

मैं इस मुद्दे रेल 3.2 उपयोग करने के बाद शुरू कर दिया लगता है, और मुझे लगता है कि name AbstractController :: बेस से विरासत में मिली है।

यह कंसोल (अर्थात् यह आरईपीसी विशिष्ट नहीं है) में समान है, मैं बिना किसी त्रुटि के AxeMailer.name कर सकता हूं, लेकिन यदि मैं Class.new(AxeMailer) करता हूं तो समस्या है।

मेरे प्रश्न हैं:

  1. वहाँ Class.new(AxeMailer)AxeMailer से अधिक
  2. वहाँ एक समस्या है, तो मैं सिर्फ यह परिवर्तन है उपयोग करने के लिए एक कारण है?
  3. वहाँ एक रास्ता कल्पना को बदलने और इसे पारित नहीं कर सकता है?
+0

क्या आप 'let' विधि के अतिरिक्त परीक्षण कोड पोस्ट कर सकते हैं? इससे हमें यह तय करने में मदद मिलेगी कि यह इस तरह क्यों लिखा गया था। –

+0

बस कुछ जोड़ा, क्या वह पर्याप्त होगा? – lulalala

+0

मेरे लिए, कोई कारण नहीं है। – shingara

उत्तर

2

मेरा अनुमान है कि यह लिखा गया था इस mailer_class.username 'username' लाइन की वजह से था। तुम सिर्फ AxeMailer सीधे इस्तेमाल करते हैं, तो username सेटिंग परीक्षण के बीच खत्म किया जा जाएगा। प्रत्येक परीक्षण के लिए एक नया सबक्लास बनाकर, आप यह सुनिश्चित कर सकते हैं कि उनके बीच कोई भी राज्य नहीं चलाया जा सके।

+0

मुझे लगता है कि यह शायद कारण है (जो कि वैसे भी महत्वपूर्ण नहीं है)। मैंने इसे संशोधित किया: '@controller_path || = parent.name.sub (/ मेलर $ /, '') .underscore' और अब के लिए पास होना प्रतीत होता है – lulalala

0

मैं अगर mailer_class वास्तविक कल्पना है या नहीं के अंदर इस्तेमाल किया जा रहा है पता नहीं है, लेकिन यह मैं क्या सोचता अपने सेटअप दिखना चाहिए की तरह है:

let(:mailer) { AxeMailer.new } 

describe '#check' do 
    before do 
    AxeMailer.username 'username' 
    mailer.from '[email protected]' 
    mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

बस होने के लिए प्रतीत नहीं होता बनाई जा रही अज्ञात वर्ग की आवश्यकता है। इसके अलावा, यह सिर्फ मेरी राय है, लेकिन आपका subject थोड़ा अजीब दिखता है। यदि आपकी आवश्यकता है तो आपकी कल्पना को लैम्ब्डा में विषय को लपेटना चाहिए, लेकिन अपने subject में ऐसा न करें।

त्रुटि आप मूल रूप से देख रहे थे के बारे में, गुमनाम वर्गों नाम नहीं हैं:

1.9.3-p0 :001 > Class.new.name 
=> nil 

ActionMailer :: बेस में से कुछ हिस्सा कुछ (शायद प्रवेश करने) और टूट जाता है जब के लिए वर्ग के नाम का उपयोग करने का प्रयास करना चाहिए यह शून्य है।

+0

धन्यवाद। 'Name' विधि 'self.controller_path' विधि में प्रयोग किया जाता है। यह 'सार नियंत्रक :: बेस' के' self.controller_path' को ओवरराइड कर रहा है।चूंकि यह एक प्रकार का 'सार कंट्रोलर :: बेस' नया है, इसे भी काम करना चाहिए (और पहले काम कर रहा है)। – lulalala

 संबंधित मुद्दे