Няма зададен ред по подразбиране за това как 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()
за да стартирате пакета, след като връзката е гарантирано осъществена.