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
यदि आप इसे साफ करने के लिए आंसू की जरूरत है। ऐसा करने से परीक्षण अलगाव सुनिश्चित होता है: प्रत्येक परीक्षण एक ज्ञात स्थिति से शुरू होता है और सफल होने के लिए पिछले परीक्षण की उपस्थिति या अनुपस्थिति पर निर्भर नहीं करता है।