Er is geen standaard ingestelde volgorde voor hoe Mocha de testbestanden laadt.
Wanneer Mocha een map scant
om bestanden te vinden, gebruikt het fs.readdirSync
. Deze oproep is een wrapper rond readdir(3)
, die zelf geen bestelling garandeert. Nu, vanwege een implementatie-gril
de uitvoer van fs.readdir
en fs.readdirSync
is gesorteerd op Linux (en waarschijnlijk POSIX-systemen in het algemeen) maar niet op Windows . Bovendien is het mogelijk dat het gesorteerde gedrag op Linux uiteindelijk kan worden verwijderd omdat de documentatie fs.readdir
zegt is gewoon readdir(3)
en de laatste garandeert geen orde. Er is een goed argument dat het waargenomen gedrag op Linux een bug is (zie het probleem waarnaar ik hierboven heb gelinkt).
Merk op dat er een --sort
. is optie die bestanden sorteert nadat Mocha ze heeft gevonden. Maar dit is standaard uitgeschakeld.
Het gedrag dat u waarneemt, kan niet alleen worden verklaard door de laadopdracht, maar ook door de uitvoeringsopdracht . Dit is wat er gebeurt:
-
Mocha laadt de testbestanden en voert ze uit. Dus alles wat zich op het hoogste niveau van uw bestand bevindt, wordt onmiddellijk uitgevoerd . Dit betekent dat de code in
test_helper.js
voert meteen uit. Elke oproep omdescribe
voert onmiddellijk zijn callback uit. Aanroepen naarit
neem de test op voor latere uitvoering. Mokka is ontdekt uw tests terwijl u dit doet, maar niet uitvoert ze meteen. -
Zodra alle bestanden zijn uitgevoerd, begint Mocha de tests uit te voeren. Tegen die tijd is de code in
test_helper.js
is al uitgevoerd en uw test profiteert van de verbinding die het heeft gemaakt.
Belangrijke waarschuwing Verbinding maken met een database is een asynchrone bewerking en momenteel is er niets dat garandeert dat de asynchrone bewerking in test_helper.js
voltooid zijn voordat de tests beginnen. Dat het nu goed werkt, is gewoon geluk.
Als ik dit was, zou ik de verbinding tot stand brengen in een globale asynchrone before
haak. (Een algemeen before
hook die in een testbestand verschijnt, wordt uitgevoerd vóór welke test dan ook, zelfs tests die in andere bestanden voorkomen. ) Of ik zou gebruiken --delay
en expliciet run()
. aanroepen om de suite te starten nadat de verbinding gegarandeerd is.