2013-01-02 17 views
7

वैरिएबल प्रारंभ करने के लिए rspec में let() का उपयोग करने के लिए बहुत समर्थन लगता है। इसके बजाय इंस्टेंस वैरिएबल (यानी @name) का उपयोग करने के लिए कुछ मामले क्या हैं?उदाहरण चर का उपयोग करते समय चलो() का उपयोग करने से अधिक फायदेमंद है?

उत्तर

14

मैं हमेशा कारणों की एक जोड़ी के लिए एक उदाहरण चर के लिए करते हैं पसंद करते हैं:

  • उदाहरण चर अस्तित्व में आने के लिए जब वे संदर्भित हो जो का मतलब है कि आप उदाहरण में किसी भी गलती चर वर्तनी तो करते हैं यह निश्चित रूप से आपको कुछ मुद्दों पर ले जाएगा क्योंकि एक नया इंस्टेंस वैरिएबल शून्य के लिए शुरू किया गया है। लेकिन यदि आप गलत वर्तनी करते हैं तो आपको नाम त्रुटि प्राप्त होगी।

  • इसके अलावा आप ब्लॉक, उससे पहले ब्लॉक हर बार निष्पादित किया जाएगा एक कल्पना भी चल पाएंगे कि अगर कल्पना न उन उदाहरण चर आप प्रारंभ की है का उपयोग जिसका मतलब है कि पहले में उदाहरण चर आरंभ कर दिया जाएगा। नीचे दिया गया उदाहरण;

    before do 
        @user = Factory :user 
        @movie = Factory :movie 
    end 
    
    it "should have user" do 
        @user.should eq User.first 
    end 
    
    it "should have movie" do 
        @movie.should eq Movie.first 
    end 
    

हालांकि सभी चश्मा ठीक चलाने, लेकिन पहले कल्पना और दूसरे में @user का कोई उपयोग नहीं में @movie की वहाँ का उपयोग नहीं कर रहा है।

आप बैंग के साथ भी उपयोग कर सकते हैं "!" let!, let आलसी मूल्यांकन किया गया है और यदि आप इसे कॉल नहीं करते हैं तो कभी भी तत्काल नहीं किया जाएगा, let का उपयोग ज्ञात सहायक को परिभाषित करने के लिए करें, जबकि let! प्रत्येक विधि कॉल से पहले बलपूर्वक मूल्यांकन किया जाता है।

+2

हो सकता है कि वह इस तरह कहने के लिए करना चाहता था। –

7

मैंने इस सवाल का समर्थन किया है, लेकिन अंत में मैं खुद से सवाल का जवाब दे रहा हूं।

मतभेद

let विधि का वर्णन करने के पहले जब इस्तेमाल किया यह चर को प्रारंभ नहीं होता है जब तक यह परीक्षण में संदर्भित है - जो बनाता है यह @instance variables से अलग जो शुरू से ही प्रारंभ कर रहे हैं।

आम तौर पर कोई बड़ा अंतर नहीं होता है। @instance variables का उपयोग करें जब आप यह सुनिश्चित करना चाहते हैं कि let ऑब्जेक्ट प्रारंभ किया गया है। लेकिन दूसरी ओर यह let! के साथ भी किया जा सकता है, इसलिए @instance variable का उपयोग करने के लिए कोई स्पष्ट कारण नहीं है।

निष्कर्ष करने के लिए, मेरे लिए, वहाँ स्पष्टlet से अधिक @instance variable उपयोग करने के लिए कारण नहीं है, लेकिन वहाँ का उपयोग करने के @instance variableslet! से अधिक

@instance variables लोड करने के लिए, और उन्हें का उपयोग करके अधिक समय लगता है कोई स्पष्ट कारण है, कर सकता है कोड में अवांछित जटिलता जो let या let!

आप इन दो जवाब पर एक नज़र ले जा सकते हैं का उपयोग करके बचा जा सकता है के लिए नेतृत्व, हो सकता है यह आप कुछ और जानकारी दे देंगे:

सभी बिंदुओं पर, `let` उदाहरण चर के लिए बेहतर है और हमेशा उदाहरण चर की तुलना में अधिक फायदेमंद है:

When to use RSpec let()?

RSpec: What is the difference between let and a before block?