Няма зададен ред по подразбиране за това как Mocha зарежда тестовите файлове.
Когато Mocha сканира директория
за да намери файлове, използва fs.readdirSync
. Това извикване е обвивка около readdir(3)код>
, което само по себе си не гарантира ред. Сега, поради странно внедряване
изхода на fs.readdir и fs.readdirSync се сортира на Linux (и вероятно POSIX системи като цяло), но не и на Windows . Освен това е възможно сортираното поведение на Linux в крайна сметка да бъде премахнато, тъй като в документацията се казва fs.readdir е просто readdir(3) а последното не гарантира ред. Има добър аргумент, че поведението, наблюдавано в Linux, е грешка (вижте проблема, към който дадох връзка по-горе).
Имайте предвид, че има --sort опция, която ще сортира файлове, след като Mocha ги намери. Но това е изключено по подразбиране.
Поведението, което наблюдавате, може да се обясни не само с реда на зареждане, но и с реда на изпълнение . Ето какво се случва:
-
Mocha зарежда тестовите файлове и ги изпълнява. Така че всичко, което е на най-високото ниво на вашия файл, се изпълнява незабавно . Това означава, че кодът в
test_helper.jsизпълнява веднага. Всяко извикване наdescribeнезабавно изпълнява своето обратно извикване. Въпреки това, извиквания къмitзапишете теста за по-късно изпълнение. Мока е откривател вашите тестове, докато правите това, но не изпълнявате ги веднага. -
След като всички файлове бъдат изпълнени, Mocha започва да изпълнява тестовете. До този момент кодът в
test_helper.jsвече е изпълнен и вашият тест се възползва от създадената от него връзка.
Основно предупреждение Свързването към база данни е асинхронна операция и в момента няма нищо, което да гарантира, че асинхронната операция в test_helper.js ще приключи преди началото на тестовете. Това, че работи добре в момента, е просто късмет.
Ако това бях аз, щях да поставя създаването на връзка в глобален асинхронен before кука. (Глобален преди кука, появяваща се във всеки тестов файл, ще бъде изпълнена преди какъвто и да е тест, дори тестове, които се появяват в други файлове. ) Или бих използвал --delay
и изрично извикване на run() за да стартирате пакета, след като връзката е гарантирано осъществена.