19

यहां रेल ट्यूटोरियल पर एम हार्टल रूबी से कुछ कोड है। क्या कोई समझा सकता है कि एक आवृत्ति परिवर्तनीय (@user) क्यों आवश्यक है और स्थानीय चर का उपयोग क्यों नहीं करें। इसके अलावा, चूंकि आवृत्ति चर को कक्षा के उदाहरण में चर माना जाता है, इसलिए कौन सा वर्ग @user से तत्काल है?rspec में इंस्टेंस चर कैसे काम करते हैं?

कि उदाहरण में एक स्थानीय चर के
require 'spec_helper' 

describe User do 

    before { @user = User.new(name: "Example User", email: "[email protected]") } 

    subject { @user } 

    it { should respond_to(:name) } 
    it { should respond_to(:email) } 
end 

उत्तर

32

उपयोग मतलब यह होगा कि इसके दायरे before के लिए प्रतिबंधित किया जाएगा और इसलिए एक त्रुटि में परिणाम। @user उपयोगकर्ता का प्रकार है लेकिन describe ब्लॉक का एक उदाहरण चर है। रुपेक में कुछ जादू है कि रन-टाइम पर प्रत्येक describe ब्लॉक से एक वर्ग बनाता है। प्रत्येक उदाहरण (it ब्लॉक) कहा वर्ग के उप-वर्ग होने के समाप्त होता है। कक्षा विरासत उदाहरणों को @user देखने देता है।

संपादित 2017-05-14

लिंक्ड ब्लॉग पोस्ट अब उपलब्ध नहीं है। वेबैक मशीन लिंक के साथ अपडेट करना + यहां प्रासंगिक खंड को रेखांकित करना।

ध्यान दें कि इसे blog post में विस्तृत रूप में एक विरोधी पैटर्न माना जाता है। इसके बजाय let का उपयोग करें।

let निम्न लाभ हैं:

  • जब एक उदाहरण में कई बार इस्तेमाल किया यह memoized है, लेकिन उदाहरण के पार नहीं ।
  • यह आलसी लोड है, इसलिए आप उन उदाहरणों के लिए चर प्रारंभ करने में समय बर्बाद नहीं करेंगे जो इसका संदर्भ नहीं देते हैं।
  • यदि आपके चर नाम पर टाइपो है तो अपवाद उठाएगा।
+1

ओह, मुझे लगता है कि मुझे अब मिल गया है।मैंने हमेशा सोचा था कि परीक्षण ब्लॉक का प्रयोग मनुष्यों के लिए अधिक पठनीय बनाने के लिए किया गया था और कुछ और नहीं। धन्यवाद :) – TradeRaider

+0

वह ब्लॉग पोस्ट अब उपलब्ध नहीं है। एक उदाहरण चर का उपयोग क्यों करना एक एंटीपाटरन है और टूटी हुई लिंक को हटाने का कारण शामिल करने के कारणों को शामिल करने के उत्तर को अद्यतन करने के लायक हो सकता है। 'Let' का उपयोग करने पर – keoghpe

2

subject विज्ञापन it ब्लॉक विभिन्न क्षेत्रों के अंतर्गत हैं, इसलिए स्थानीय चर काम नहीं करेंगे। @user हुड के तहत आरएसपीसी द्वारा उत्पन्न कक्षा से संबंधित है।

12

आप स्थानीय चर का उपयोग नहीं कर सकते क्योंकि स्थानीय चर केवल स्थानीय विधि के दायरे में मौजूद है। before, subject और it एक ही कक्षा के भीतर विभिन्न क्षेत्रों को उत्पन्न करता है।

निम्नलिखित कोड

before { user = User.new(name: "Example User", email: "[email protected]") } 

एक अपरिभाषित चर जब आप

subject { user } 

उदाहरण @user में इसे कहते बढ़ा देंगे सभी User (के बाद वर्ग का एक उदाहरण है, तो आप User.new साथ इसे बनाने के)।

हालांकि, उदाहरण चर के बजाय आप let कमांड का उपयोग करना चाहेंगे। इसके अलावा, अगर आप

subject { User.new(name: "Example User", email: "[email protected]") } 

before के उपयोग की आवश्यकता नहीं है परिभाषित करते हैं। let(:subject) को परिभाषित करने के बराबर, उदाहरण के उपयोग के लिए subject विधि उपलब्ध कराने के लिए आपको अतिरिक्त लाभ भी मिलेगा।

+4

+1: 'चलो (: उपयोगकर्ता) {User.create (नाम:" उदाहरण उपयोगकर्ता ", ईमेल:" [email protected] ")}' – Meltemi

+0

+1 विषय का उपयोग करने पर +1: विषय {उपयोगकर्ता। नया (नाम: "उदाहरण उपयोगकर्ता", ईमेल: "[email protected]")} –

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