सारांश: RSpec का विषय एक विशेष चर है जो कि परीक्षण की जा रही वस्तु को संदर्भित करता है। इस पर उम्मीदें निहित की जा सकती हैं, जो एक-पंक्ति के उदाहरणों का समर्थन करता है। यह कुछ मुहावरेदार मामलों में पाठक को स्पष्ट है, लेकिन अन्यथा समझने में कठिन है और इसे टाला जाना चाहिए। RSpec के let
चर केवल आलसी तात्कालिक (याद किए गए) चर हैं। वे विषय के रूप में पालन करने के लिए कठिन नहीं हैं, लेकिन अभी भी पेचीदा परीक्षणों का नेतृत्व कर सकते हैं इसलिए विवेक के साथ उपयोग किया जाना चाहिए।
विषय
यह काम किस प्रकार करता है
विषय वस्तु का परीक्षण किया जा रहा है। RSpec में विषय का एक स्पष्ट विचार है। यह परिभाषित किया जा सकता है या नहीं। यदि यह है, तो RSpec स्पष्ट रूप से संदर्भित किए बिना इस पर तरीके कह सकता है।
डिफ़ॉल्ट रूप से, यदि बाहरी उदाहरण समूह ( describe
या context
ब्लॉक) के लिए पहला तर्क एक वर्ग है, तो RSpec उस वर्ग का एक उदाहरण बनाता है और उसे विषय पर असाइन करता है। उदाहरण के लिए, निम्नलिखित पास:
class A
end
describe A do
it "is instantiated by RSpec" do
expect(subject).to be_an(A)
end
end
आप इस विषय को खुद से परिभाषित कर सकते हैं subject
:
describe "anonymous subject" do
subject { A.new }
it "has been instantiated" do
expect(subject).to be_an(A)
end
end
जब आप इसे परिभाषित करते हैं तो आप विषय को एक नाम दे सकते हैं:
describe "named subject" do
subject(:a) { A.new }
it "has been instantiated" do
expect(a).to be_an(A)
end
end
यदि आप विषय का नाम रखते हैं, तो भी आप इसे गुमनाम रूप से संदर्भित कर सकते हैं:
describe "named subject" do
subject(:a) { A.new }
it "has been instantiated" do
expect(subject).to be_an(A)
end
end
आप एक से अधिक नामित विषय को परिभाषित कर सकते हैं। सबसे हाल ही में परिभाषित नाम विषय गुमनाम है subject
।
हालाँकि विषय परिभाषित है,
यह तात्कालिक रूप से आलसी है। यही है, वर्णित वर्ग के निहित तात्कालिकता या पारित ब्लॉक का निष्पादन subject
तब तक नहीं होता है जब तक subject
या नामित विषय को एक उदाहरण में संदर्भित नहीं किया जाता है। यदि आप चाहते हैं कि आपका अन्वेषण विषय उत्सुकता से त्वरित रूप से (इसके समूह में एक उदाहरण से पहले) चलता है, तो subject!
इसके बजाय कहें subject
।
इस पर अपेक्षाएं निहित की जा सकती हैं (बिना लिखे subject
या किसी नामित विषय के)
describe A do
it { is_expected.to be_an(A) }
end
विषय इस एक-पंक्ति सिंटैक्स का समर्थन करने के लिए मौजूद है।
इसका उपयोग कब करें
एक अंतर्निहित subject
(उदाहरण समूह से अनुमानित) को समझना मुश्किल है क्योंकि
- यह पर्दे के पीछे तात्कालिक है।
- चाहे इसका उपयोग स्पष्ट रूप से (
is_expected
स्पष्ट रिसीवर के बिना कॉल करके ) या स्पष्ट रूप से किया गया हो (जैसा किsubject
) उपयोग किया जाता है, यह पाठक को उस वस्तु की भूमिका या प्रकृति के बारे में कोई जानकारी नहीं देता है जिस पर उम्मीद की जा रही है।
- वन-लाइनर उदाहरण सिंटैक्स में उदाहरण विवरण (
it
सामान्य उदाहरण सिंटैक्स में स्ट्रिंग तर्क ) नहीं होता है, इसलिए पाठक को केवल उदाहरण के उद्देश्य के बारे में जानकारी ही अपेक्षा होती है।
इसलिए, यह केवल एक अंतर्निहित विषय का उपयोग करने के लिए उपयोगी है जब संदर्भ को सभी पाठकों द्वारा अच्छी तरह से समझा जा सकता है और उदाहरण के विवरण की वास्तव में कोई आवश्यकता नहीं है । विहित मामला सक्रिय मिलान सत्यापनों के साथ कंधे मिलानकर्ताओं का परीक्षण कर रहा है:
describe Article do
it { is_expected.to validate_presence_of(:title) }
end
एक खोज अनाम subject
( subject
नाम के बिना परिभाषित ) थोड़ा बेहतर है, क्योंकि पाठक देख सकता है कि यह कैसे त्वरित है, लेकिन
- यह अभी भी उस विषय की तात्कालिकता को दूर रख सकता है जहाँ से इसका उपयोग किया जाता है (उदाहरण के लिए एक उदाहरण समूह के शीर्ष पर कई उदाहरण जो इसका उपयोग करते हैं), जिसका पालन करना अभी भी कठिन है, और
- यह अन्य समस्याएं हैं जो अंतर्निहित विषय करता है।
एक नामित विषय एक इरादा-प्रकट करने वाला नाम प्रदान करता है, लेकिन एक let
चर के बजाय एक नामित विषय का उपयोग करने का एकमात्र कारण यह है कि यदि आप अनाम विषय का कुछ समय का उपयोग करना चाहते हैं, और हमने अभी बताया कि अनाम विषय को समझना कठिन क्यों है।
तो, एक स्पष्ट अनाम subject
या एक नामित विषय के वैध उपयोग बहुत दुर्लभ हैं ।
let
चर
वे कैसे काम करते हैं
let
चर केवल दो अंतरों को छोड़कर नामित विषयों की तरह हैं:
- वे के साथ परिभाषित कर रहे हैं
let
/ let!
के बजाय subject
/subject!
- वे अनाम सेट नहीं करते हैं
subject
या अपेक्षाओं को इस पर कॉल करने की अनुमति नहीं देते हैं।
उनका उपयोग कब करना है
let
उदाहरणों के बीच दोहराव को कम करने के लिए उपयोग करना पूरी तरह से वैध है । हालाँकि, ऐसा तभी करें जब यह टेस्ट क्लैरिटी का त्याग न करे। उपयोग करने का सबसे सुरक्षित समय let
वह होता है जब let
चर का उद्देश्य अपने नाम से पूरी तरह से स्पष्ट होता है (ताकि पाठक को परिभाषा नहीं मिलनी चाहिए, जो कई पंक्तियों को दूर कर सकता है, प्रत्येक उदाहरण को समझने के लिए) और यह उसी तरह से उपयोग किया जाता है हर उदाहरण में। यदि उन चीजों में से कोई भी सत्य नहीं है, तो एक सादे पुराने स्थानीय चर में वस्तु को परिभाषित करने या उदाहरण में फ़ैक्टरी विधि को सही कहने पर विचार करें।
let!
जोखिम भरा है, क्योंकि यह आलसी नहीं है। यदि कोई उदाहरण समूह में एक उदाहरण जोड़ता है जिसमें प्रारूप है let!
, लेकिन उदाहरण को let!
चर की आवश्यकता नहीं है ,
- उस उदाहरण को समझना कठिन होगा, क्योंकि पाठक
let!
चर को देखेगा और आश्चर्य करेगा कि क्या और कैसे इस उदाहरण को प्रभावित करता है
- उदाहरण के लिए धीमी गति से हो जाएगा, क्योंकि यह समय बनाने के लिए लिया जाता है, क्योंकि
let!
चर बनाने के लिए
तो उपयोग करें let!
, यदि बिल्कुल, केवल छोटे, सरल उदाहरण समूहों में, जहां यह संभावना कम है कि भविष्य के उदाहरण लेखक उस जाल में गिर जाएंगे।
एकल-अपेक्षा-प्रति-उदाहरण बुत
विषयों या let
चर का एक सामान्य अति प्रयोग है जो अलग से चर्चा करने लायक है। कुछ लोग उन्हें इस तरह से उपयोग करना पसंद करते हैं:
describe 'Calculator' do
describe '#calculate' do
subject { Calculator.calculate }
it { is_expected.to be >= 0 }
it { is_expected.to be <= 9 }
end
end
(यह एक विधि का एक सरल उदाहरण है जो एक संख्या देता है जिसके लिए हमें दो अपेक्षाओं की आवश्यकता होती है, लेकिन इस शैली के कई और उदाहरण / अपेक्षाएं हो सकती हैं यदि विधि अधिक जटिल मान लौटाती है जिसे कई अपेक्षाओं और / या कई दुष्प्रभावों की आवश्यकता होती है जो सभी को उम्मीदें हैं।)
लोग ऐसा इसलिए करते हैं क्योंकि उन्होंने सुना है कि प्रति उदाहरण के लिए केवल एक ही अपेक्षा होनी चाहिए (जो कि वैध नियम के साथ मिश्रित है कि किसी को प्रति उदाहरण केवल एक विधि कॉल का परीक्षण करना चाहिए) या क्योंकि वे RSpec चालबाजी के साथ प्यार में हैं। एक अनाम या नामित विषय या एक let
चर के साथ, यह मत करो ! इस शैली में कई समस्याएं हैं:
- अनाम विषय उदाहरणों का विषय नहीं है - विधि विषय है। परीक्षा को इस तरह से लिखने से भाषा खराब हो जाती है, जिसके बारे में सोचना मुश्किल हो जाता है।
- हमेशा की तरह वन-लाइन उदाहरणों के साथ, उम्मीदों का अर्थ समझाने के लिए कोई जगह नहीं है।
- प्रत्येक उदाहरण के लिए विषय का निर्माण किया जाना है, जो धीमा है।
इसके बजाय, एक एकल उदाहरण लिखें:
describe 'Calculator' do
describe '#calculate' do
it "returns a single-digit number" do
result = Calculator.calculate
expect(result).to be >= 0
expect(result).to be <= 9
end
end
end