Det finns ingen förinställd ordning för hur Mocha laddar testfilerna.
När Mocha skannar en katalog
för att hitta filer i den använder den fs.readdirSync
. Det här anropet är ett omslag runt readdir(3)
, vilket i sig inte garanterar ordning. Nu, på grund av en implementeringsquirk
utdata från fs.readdir
och fs.readdirSync
sorteras på Linux (och förmodligen POSIX-system i allmänhet) men inte på Windows . Dessutom är det möjligt att det sorterade beteendet på Linux så småningom kan tas bort eftersom dokumentationen säger fs.readdir
är bara readdir(3)
och det senare garanterar inte ordning. Det finns ett bra argument att framföra att beteendet som observeras på Linux är ett fel (se problemet jag länkade till ovan).
Observera att det finns en --sort
alternativ som kommer att sortera filer efter att Mocha hittat dem. Men detta är avstängt som standard.
Beteendet du observerar kan förklaras inte bara genom laddningsorder utan genom exekveringsorder . Så här händer:
-
Mocha laddar testfilerna och kör dem. Så allt som är på den översta nivån i din fil körs genast . Det betyder att koden i
test_helper.js
körs direkt. Varje samtal tillbeskriv
utför omedelbart sin återuppringning. Anropar dock tillit
spela in testet för senare körning. Mocha upptäcker dina tester medan du gör detta men inte kör dem direkt. -
När alla filer har körts börjar Mocha köra testerna. Vid det här laget är koden i
test_helper.js
har redan körts och ditt test drar nytta av anslutningen som det har skapat.
Stor varning Att ansluta till en databas är en asynkron operation, och för närvarande finns det inget som garanterar att den asynkrona operationen i test_helper.js
kommer att ha genomförts innan proven startar. Att det fungerar bra just nu är bara tur.
Om det här var jag skulle jag antingen lägga anslutningsskapandet i en global asynkron före
krok. (En global före
Hook som förekommer i en testfil kommer att köras före vilket som helst test, även tester som visas i andra filer. ) Eller så skulle jag använda --delay
och anropa uttryckligen run()
för att starta sviten efter att anslutningen garanterat kommer att göras.