Il n'y a pas d'ordre défini par défaut pour la façon dont Mocha charge les fichiers de test.
Lorsque Mocha analyse un répertoire
pour trouver des fichiers, il utilise fs.readdirSync
. Cet appel est un wrapper autour de readdir(3)
, qui en soi ne garantit pas l'ordre. Maintenant, en raison d'une bizarre d'implémentation
la sortie de fs.readdir
et fs.readdirSync
est trié sur Linux (et probablement les systèmes POSIX en général) mais pas sur Windows . De plus, il est possible que le comportement trié sous Linux puisse éventuellement être supprimé car la documentation indique fs.readdir
est juste readdir(3)
et ce dernier ne garantit pas l'ordre. Il y a un bon argument à faire valoir que le comportement observé sur Linux est un bogue (voir le problème auquel j'ai lié ci-dessus).
Notez qu'il y a un --sort
option qui triera les fichiers une fois que Mocha les aura trouvés. Mais ceci est désactivé par défaut.
Le comportement que vous observez s'explique non seulement par l'ordre de chargement mais aussi par l'ordre d'exécution . Voici ce qui se passe :
-
Mocha charge les fichiers de test et les exécute. Ainsi, tout ce qui se trouve au niveau supérieur de votre fichier s'exécute immédiatement . Cela signifie que le code dans
test_helper.js
s'exécute tout de suite. Chaque appel àdescribe
exécute immédiatement son callback. Cependant, les appels versit
enregistrer le test pour une exécution ultérieure. Moka se découvre vos tests tout en faisant cela mais pas en exécutant les tout de suite. -
Une fois tous les fichiers exécutés, Mocha commence à exécuter les tests. À ce stade, le code dans
test_helper.js
a déjà été exécuté et votre test bénéficie de la connexion qu'il a créée.
Avertissement majeur La connexion à une base de données est une opération asynchrone, et actuellement rien ne garantit que l'opération asynchrone dans test_helper.js
aura terminé avant le début des tests. Que cela fonctionne bien en ce moment, c'est juste de la chance.
Si c'était moi, je mettrais soit la création de connexion dans un before
asynchrone global accrocher. (Un mondial before
le crochet apparaissant dans n'importe quel fichier de test sera exécuté avant tout test quel qu'il soit, même les tests qui apparaissent dans d'autres fichiers. ) Ou j'utiliserais utiliser --delay
et appelez explicitement run()
pour démarrer la suite une fois la connexion garantie.