लोगों को लगता है कि कुछ बुनियादी तरीकों के बारे में बताया गया है जिसमें वे अलग-अलग हैं, लेकिन बाहर निकल गए before(:all)और यह स्पष्ट नहीं करते हैं कि उनका उपयोग क्यों किया जाना चाहिए।
यह मेरा विश्वास है कि उदाहरण के चर का कोई स्थान नहीं है, जो कि अधिकांश स्पेक्स में इस्तेमाल किया जा रहा है, आंशिक रूप से इस उत्तर में दिए गए कारणों के कारण , इसलिए मैं उन्हें यहां एक विकल्प के रूप में उल्लेख नहीं करूंगा।
ब्लॉक होने दें
एक letब्लॉक के भीतर कोड केवल तब निष्पादित किया जाता है जब संदर्भित किया जाता है, आलसी लोडिंग का मतलब है कि इन ब्लॉकों का आदेश अप्रासंगिक है। यह आपको अपने चश्मे के माध्यम से दोहराया सेटअप पर कटौती करने के लिए बड़ी मात्रा में बिजली देता है।
इसका एक (अत्यंत छोटा और वंचित) उदाहरण है:
let(:person) { build(:person) }
subject(:result) { Library.calculate_awesome(person, has_moustache) }
context 'with a moustache' do
let(:has_moustache) { true }
its(:awesome?) { should be_true }
end
context 'without a moustache' do
let(:has_moustache) { false }
its(:awesome?) { should be_false }
end
आप देख सकते हैं कि has_moustacheप्रत्येक मामले में अलग-अलग परिभाषित किया गया है, लेकिन subjectपरिभाषा को दोहराने की आवश्यकता नहीं है । नोट करने के लिए कुछ महत्वपूर्ण यह है कि letवर्तमान संदर्भ में परिभाषित अंतिम ब्लॉक का उपयोग किया जाएगा। यह अधिकांश ऐनक के लिए उपयोग किए जाने वाले डिफ़ॉल्ट को सेट करने के लिए अच्छा है, जिसे जरूरत पड़ने पर अधिलेखित किया जा सकता है।
उदाहरण के लिए, calculate_awesomeयदि किसी personमॉडल के top_hatसेट के सही होने पर रिटर्न वैल्यू की जाँच की जाए , लेकिन कोई मूंछ नहीं होगी:
context 'without a moustache but with a top hat' do
let(:has_moustache) { false }
let(:person) { build(:person, top_hat: true) }
its(:awesome?) { should be_true }
end
लेट ब्लॉक्स के बारे में एक और बात ध्यान दें, यदि आप डेटाबेस में सहेजे गए हैं (यानी Library.find_awesome_people(search_criteria)) खोज रहे हैं तो उनका उपयोग नहीं किया जाना चाहिए क्योंकि वे डेटाबेस में तब तक सहेजे नहीं जाएंगे जब तक कि उन्हें पहले ही संदर्भित नहीं किया गया हो। let!या beforeब्लॉक यहां क्या उपयोग किया जाना चाहिए।
इसके अलावा, कभी भी ब्लॉकों के beforeनिष्पादन को ट्रिगर करने के लिए उपयोग न करें let, यह वही है जो के let!लिए बनाया गया है!
करते हैं! ब्लॉक
let!ब्लॉकों को उस क्रम में निष्पादित किया जाता है जिसे वे परिभाषित किया गया है (पहले ब्लॉक की तरह)। ब्लॉक करने से पहले एक मुख्य अंतर यह है कि आपको इस चर का एक स्पष्ट संदर्भ मिलता है, बजाय उदाहरण के चर पर वापस आने की आवश्यकता के बजाय।
letब्लॉक के साथ के रूप में , यदि एक let!ही नाम के साथ कई ब्लॉक परिभाषित किए गए हैं, तो सबसे हाल ही में निष्पादन में उपयोग किया जाएगा। इस तरह से उपयोग किए जाने पर मुख्य अंतर यह है कि let!ब्लॉक को कई बार निष्पादित किया letजाएगा , जबकि ब्लॉक केवल अंतिम बार निष्पादित करेगा।
पहले (: प्रत्येक) ब्लॉक
before(:each)ब्लॉक से पहले डिफ़ॉल्ट है, और इसलिए हर बार before {}पूर्ण निर्दिष्ट करने के बजाय संदर्भित किया जा सकता है before(:each) {}।
beforeकुछ मुख्य स्थितियों में ब्लॉक का उपयोग करना मेरी व्यक्तिगत प्राथमिकता है। मैं ब्लॉक से पहले उपयोग करूंगा यदि:
- मैं मॉकिंग, स्टबिंग या डबल्स का उपयोग कर रहा हूं
- कोई भी उचित आकार का सेटअप है (आमतौर पर यह एक संकेत है कि आपके कारखाने के लक्षण सही ढंग से सेटअप नहीं हुए हैं)
- ऐसे कई चर हैं जिन्हें मुझे सीधे संदर्भित करने की आवश्यकता नहीं है, लेकिन सेटअप के लिए आवश्यक हैं
- मैं रेल में कार्यात्मक नियंत्रक परीक्षण लिख रहा हूं, और मैं परीक्षण (यानी
before { get :index }) के लिए एक विशेष अनुरोध निष्पादित करना चाहता हूं । भले ही आप subjectबहुत सारे मामलों में इसके लिए उपयोग कर सकते हों , कभी-कभी आपको संदर्भ की आवश्यकता नहीं होने पर यह अधिक स्पष्ट लगता है।
यदि आप अपने आप beforeको अपने चश्मे के लिए बड़े ब्लॉक लिखते हैं , तो अपने कारखानों की जांच करें और सुनिश्चित करें कि आप लक्षण और उनके लचीलेपन को पूरी तरह से समझते हैं।
पहले (: सभी) ब्लॉक
वर्तमान संदर्भ (और उसके बच्चों) में चश्मा से पहले ये केवल एक बार निष्पादित किए जाते हैं। अगर सही ढंग से लिखा जाए तो इनका इस्तेमाल बड़े फायदे के लिए किया जा सकता है, क्योंकि कुछ ऐसी परिस्थितियां हैं जो निष्पादन और प्रयास में कटौती कर सकती हैं।
एक उदाहरण (जो शायद ही निष्पादन समय को प्रभावित करेगा) एक परीक्षण के लिए एक ईएनवी चर का मजाक उड़ा रहा है, जिसे आपको केवल एक बार करने की आवश्यकता होगी।
उम्मीद है की वो मदद करदे :)