मोचा परीक्षण फ़ाइलों को कैसे लोड करता है, इसके लिए कोई डिफ़ॉल्ट सेट ऑर्डर नहीं है।
जब मोचा निर्देशिका स्कैन करता है
इसे फ़ाइलों को खोजने के लिए, यह fs.readdirSync
का उपयोग करता है
. यह कॉल readdir(3)के आसपास एक आवरण है। कोड>
, जो स्वयं आदेश की गारंटी नहीं देता है। अब, एक कार्यान्वयन विचित्रता
के कारण fs.readdir
. का आउटपुट और fs.readdirSync
Linux (और शायद सामान्य रूप से POSIX सिस्टम) पर सॉर्ट किया गया है, लेकिन Windows पर नहीं . इसके अलावा, यह संभव है कि लिनक्स पर क्रमबद्ध व्यवहार को अंततः हटाया जा सकता है क्योंकि प्रलेखन कहता है fs.readdir
बस है readdir(3)
और बाद वाला आदेश की गारंटी नहीं देता है। एक अच्छा तर्क दिया जाना चाहिए कि लिनक्स पर देखा गया व्यवहार एक बग है (उस मुद्दे को देखें जिसे मैंने ऊपर लिंक किया है)।
ध्यान दें कि एक --sort
है विकल्प जो मोचा को ढूंढने के बाद फाइलों को सॉर्ट करेगा। लेकिन यह डिफ़ॉल्ट रूप से बंद होता है।
आप जो व्यवहार देखते हैं, वह न केवल लोडिंग ऑर्डर द्वारा बल्कि निष्पादन आदेश द्वारा भी समझा जा सकता है . यहाँ क्या होता है:
-
मोचा परीक्षण फ़ाइलों को लोड करता है और उन्हें निष्पादित करता है। तो आपकी फ़ाइल के शीर्ष स्तर पर जो कुछ भी है वह तुरंत निष्पादित होता है . इसका मतलब है कि
test_helper.js
. में कोड तुरंत निष्पादित करता है।वर्णन
. के लिए प्रत्येक कॉल तुरंत इसकी कॉलबैक निष्पादित करता है। हालांकि,इसे
पर कॉल करता है बाद में निष्पादन के लिए परीक्षण रिकॉर्ड करें। मोचा खोज रहा है ऐसा करते समय आपके परीक्षण लेकिन निष्पादित . नहीं उन्हें तुरंत। -
एक बार सभी फाइलें निष्पादित हो जाने के बाद, मोचा परीक्षण चलाना शुरू कर देता है। इस समय तक,
test_helper.js
. में कोड पहले ही चल चुका है और आपका परीक्षण उसके द्वारा बनाए गए कनेक्शन से लाभान्वित होता है।
प्रमुख चेतावनी डेटाबेस से कनेक्ट करना एक एसिंक्रोनस ऑपरेशन है, और वर्तमान में ऐसा कुछ भी नहीं है जो गारंटी देता है कि test_helper.js
में एसिंक्रोनस ऑपरेशन परीक्षण शुरू होने से पहले पूरा हो जाएगा। यह अभी ठीक काम कर रहा है यह सिर्फ किस्मत है।
अगर यह मैं होता, तो मैं या तो कनेक्शन निर्माण को वैश्विक एसिंक्रोनस पहले
. में डाल देता अंकुश। (ए वैश्विक पहले
किसी भी परीक्षण फ़ाइल में प्रदर्शित होने वाले हुक को किसी भी परीक्षण से पहले निष्पादित किया जाएगा, यहां तक कि अन्य फ़ाइलों में दिखाई देने वाले परीक्षण भी। ) या मैं --delay
का उपयोग करूंगा
और स्पष्ट रूप से कॉल करें run()
कनेक्शन की गारंटी के बाद सुइट शुरू करने के लिए।