`पहले ()` और `पहले () (`) के बीच क्या अंतर है?


90

विशेष रूप से क्या बीच का अंतर है मोचा की before()और beforeEach()? (के लिए एक ही प्रश्न after()और afterEach()।)

मुझे लगता है कि before()प्रति describe()ब्लॉक एक बार चलता है , और beforeEach()परीक्षण ( it()ब्लॉक) के अनुसार एक बार चलता है । क्या यह सच है?

और मैं कब एक का उपयोग करना चुनूंगा?

जवाबों:


188

before()पहले एक बार चलाया जाता है सभी एक में परीक्षण describe
after()   एक बार चलाया जाता है के बाद सभी एक में परीक्षण describe
beforeEach()से पहले चलाया जाता है प्रत्येक एक में परीक्षण describe
afterEach()   के बाद चलाया जाता है प्रत्येक एक में परीक्षणdescribe

आप किसका उपयोग करना चाहते हैं यह आपके वास्तविक परीक्षण पर निर्भर करता है।

अब, लंबे स्पष्टीकरण के लिए। यदि आप mocha -R minइस पर चलते हैं :

describe("top", function () {
    before(function () {
        console.log("top before");
    });
    after(function () {
        console.log("top after");
    });
    beforeEach(function () {
        console.log("top beforeEach");
    });
    afterEach(function () {
        console.log("top afterEach");
    });
    it("test1", function () {
        console.log("top test1");
    });
    describe("sublevel", function() {
        before(function () {
            console.log("sublevel before");
        });
        after(function () {
            console.log("sublevel after");
        });
        beforeEach(function () {
            console.log("sublevel beforeEach");
        });
        afterEach(function () {
            console.log("sublevel afterEach");
        });
        it("test1", function () {
            console.log("sublevel test1");
        });
        it("test2", function () {
            console.log("sublevel test2");
        });
    });
    it("test2", function () {
        console.log("top test2");
    });
});

आपको कुछ ऐसा दिखाई देगा (मैंने वह आउटपुट छोड़ दिया है जो प्रासंगिक नहीं है):

top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after

बात यह है कि अगर आप क्या पहले और sublevel में परीक्षण से प्रत्येक के बाद निष्पादित करता है पर देखने के आश्चर्य की बात की जा सकती है वह यह है कि दोनोंbeforeEach शीर्ष स्तर पर और sublevel पर कॉलबैक कहा जाता है। के लिए एक ही बात है afterEach

कुछ भी अनुक्रम से हैरान कर रहे हैं sublevel before, top beforeEach, sublevel beforeEach। उन्हें लगता है कि एक बाहरी दायरे में स्थित सभी हुक, एक आंतरिक दायरे में स्थित सभी हुक से पहले अमल करना चाहिए ताकि वे अनुक्रम उम्मीद: top beforeEach, sublevel before, sublevel beforeEach। हालांकि, जिस क्रम में मोचा हुक निष्पादित करता है वह पूरी तरह से समझ में आता है: एक beforeहुक का मतलब परीक्षण के एक समूह के लिए चरण निर्धारित करना है, जबकि एक beforeEachपरीक्षण प्रत्येक व्यक्तिगत परीक्षणों के लिए है। जब मोचा एक परीक्षण को अंजाम देता है, तो उसमें जो भी हुक लगाए जाते हैं , वे सभी beforeऔर beforeEachहुक describeउस पर describeलागू होते हैं। मोचा प्रत्येक beforeहुक को बाहरी दायरे से अंतरतम तक और सभी beforeEachहुक को बाहरी दायरे से अंतरतम तक ले जाएगा। तथापि, सभी beforeहुक जो लागू होते हैं, उन्हें किसी भी beforeEachहुक से पहले निष्पादित किया जाता है । यह ऊपर दिए गए आदेश की व्याख्या sublevel beforeकरता है : इससे पहले निष्पादित करता है top beforeEachक्योंकि यह एक beforeहुक है। और, afterऔर afterEach, एक ही तर्क लागू होता है लेकिन आदेश उलटा होता है: afterEachलागू होने वाले सभी हुक किसी भी afterहुक से पहले निष्पादित होते हैं ।

यह भी ध्यान दें कि मोचा को इस बात की परवाह नहीं है कि मैंने अपने itकॉल describeको शीर्ष स्तर में कॉल के सापेक्ष कैसे आदेश दिया describe। यह निष्पादित करता है top test1, top test2और फिर सुबल परीक्षण करता है, भले ही मैंने जो आदेश दिया था top test1, फिर उपरिशायी परीक्षण और फिर top test2

क्या आप के बीच में उपयोग करना चाहते हैं before, beforeEachआदि वास्तव में अपने परीक्षण की बारीकियों पर निर्भर करता है। यदि आपको एक नकली वस्तु या डेटा संरचना सेट करने की आवश्यकता है और इस ऑब्जेक्ट या संरचना को एक ही बार में सभी परीक्षणों द्वारा पुन: उपयोग किया जा सकता है describe, तो आप beforeइसे सेट करने के लिए, और afterइसे फाड़ने के लिए उपयोग कर सकते हैं । यह मामला हो सकता है यदि आप संरचना पर केवल-परीक्षण कर रहे हैं। यदि आपके सभी परीक्षण केवल इसे पढ़ते हैं, तो इसे बार-बार बनाने की आवश्यकता नहीं है। यदि आपकी प्रत्येक परीक्षा में संरचना की describeएक नई प्रतिलिपि की आवश्यकता है , क्योंकि प्रत्येक परीक्षण संरचना को संशोधित कर रहा है, तो आपको beforeEachप्रत्येक परीक्षण के लिए संरचना नए सिरे से बनाने के लिए उपयोग करना चाहिए और फिरafterEachयदि आप इसे साफ करने के लिए आंसू की जरूरत है। ऐसा करने से परीक्षण अलगाव सुनिश्चित होता है: प्रत्येक परीक्षण एक ज्ञात स्थिति से शुरू होता है और सफल होने के लिए पिछले परीक्षण की उपस्थिति या अनुपस्थिति पर निर्भर नहीं करता है।


1
बहुत बहुत धन्यवाद। मेरा सवाल क्या था और क्यों भाग, यह नाखून दोनों, विशेष रूप से पढ़ने / लिखने के बीच का अंतर।
एरिक्सोको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.