मुझे let
और let!
के बीच अंतर बहुत सरल उदाहरण के साथ अंतर समझा गया। मुझे पहले दस्तावेज़ वाक्य पढ़ने दो, फिर आउटपुट हाथ दिखाएं।
About let दस्तावेज़ कहते हैं: -
... let
है आलसी से मूल्यांकन: यह पहली बार विधि में परिभाषित करता है शुरू हो जाती है जब तक मूल्यांकन नहीं किया गया है।
मैं नीचे दिए गए उदाहरण के साथ अंतर समझ में आ: -
$count = 0
describe "let" do
let(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
अब चला सकते हैं: -
[email protected]:~/Ruby> rspec spec/test_spec.rb
F
Failures:
1) let is not cached across examples
Failure/Error: expect($count).to eq(1)
expected: 1
got: 0
(compared using ==)
# ./spec/test_spec.rb:8:in `block (2 levels) in <top (required)>'
Finished in 0.00138 seconds (files took 0.13618 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/test_spec.rb:7 # let is not cached across examples
[email protected]:~/Ruby>
क्यों त्रुटि? क्योंकि, जैसा कि डॉक्टर ने कहा था, let
, के साथ इसका मूल्यांकन तब तक नहीं किया जाता जब तक कि पहली बार जिस तरीके से परिभाषित किया जाता है, उसे लागू नहीं किया जाता है।उदाहरण में, हमने count
का आह्वान नहीं किया, इस प्रकार $count
अभी भी 0
है, 1
द्वारा वृद्धि नहीं हुई है।
अब let!
भाग में आ रहा है। डॉक्टर
.... आप का उपयोग कर सकते हैं! प्रत्येक उदाहरण से पहले विधि के आवेषण को मजबूर करने के लिए। इसका मतलब यह भी है कि आपने सहायक विधि उदाहरण के अंदर विधि का आह्वान नहीं किया है, फिर भी यह आपके उदाहरण चलाने से पहले लागू किया जाएगा।
चलें यह भी परीक्षण: -:
[email protected]:~/Ruby> rspec spec/test_spec.rb
.
Finished in 0.00145 seconds (files took 0.13458 seconds to load)
1 example, 0 failures
देखें, अब $count
रिटर्न 1
, इस प्रकार परीक्षण -
यहाँ संशोधित कोड
$count = 0
describe "let" do
let!(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
इस कोड को चलाने देता है पारित हो गया ऐसा इसलिए हुआ क्योंकि मैंने let!
का उपयोग किया, जो कि उदाहरण चलाने से पहले चलता है, हालांकि हमने हमारे उदाहरण के अंदर count
नहीं बुलाया था।
इस प्रकार let
और let!
एक दूसरे से अलग है।
सहमत हुए, यही कारण है कि पहला नमूना समझ में आता है। निश्चित रूप से, हालांकि, दूसरे spec का उदाहरण उदाहरण से पहले मूल्यांकन किया जाएगा, (इसे 1 के बराबर बनाते हैं) और फिर फिर "count.should" को कॉल करते समय (इसे 2 के बराबर बनाते हुए)? –
नहीं, यह पहले से ही बुलाया गया है और याद किया गया है, इसलिए $ गिनती फिर से नहीं बढ़ी है। वैसे भी, यदि आपके पास एक और उदाहरण है, तो पहले हुक को फिर से बुलाया जाता है। मेरा संपादित उत्तर देखें, मैंने स्पष्टीकरण के लिए कुछ कोड जोड़ा। – dhoelzgen
तो इसका मतलब यह होगा कि यदि आप "चलो" और एक स्पेक (एक "इसे") का उपयोग करते हैं तो "गिनती" नहीं करते हैं।"(या समान) होना चाहिए तो वृद्धि नहीं होगी? यदि ऐसा है, तो" चलो "को" पहले "नहीं माना जाना चाहिए, क्योंकि डिफ़ॉल्ट रूप से पहले" चलो! "की कार्यक्षमता का तात्पर्य है। क्या मुझे कुछ याद आ रहा है? –