MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment Mocha sait quel fichier charger en premier dans la suite de tests

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 :

  1. 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 vers it 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.

  2. 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.