Non esiste un ordine predefinito per il modo in cui Mocha carica i file di prova.
Quando Mocha scansiona una directory
per trovarlo, usa fs.readdirSync
. Questa chiamata è un wrapper di readdir(3)
, che di per sé non garantisce l'ordine. Ora, a causa di una stranezza di implementazione
l'output di fs.readdir
e fs.readdirSync
è ordinato su Linux (e probabilmente su sistemi POSIX in generale) ma non su Windows . Inoltre, è possibile che il comportamento ordinato su Linux possa essere eventualmente rimosso perché la documentazione dice fs.readdir
è solo readdir(3)
e quest'ultimo non garantisce l'ordine. C'è una buona argomentazione da sostenere che il comportamento osservato su Linux è un bug (vedi il problema che ho collegato sopra).
Nota che esiste un --sort
opzione che ordinerà i file dopo che Mocha li avrà trovati. Ma questo è disattivato per impostazione predefinita.
Il comportamento che osservi è spiegabile non solo dall'ordine di caricamento, ma anche dall'ordine di esecuzione . Ecco cosa succede:
-
Mocha carica i file di prova e li esegue. Quindi tutto ciò che è al livello più alto del tuo file viene eseguito immediatamente . Ciò significa che il codice in
test_helper.js
esegue subito. Ogni chiamata adescribe
esegue immediatamente la sua richiamata. Tuttavia, chiama ait
registrare il test per l'esecuzione successiva. Mocha sta scoperta i tuoi test mentre esegui questa operazione ma non esegui subito. -
Una volta che tutti i file sono stati eseguiti, Mocha inizia a eseguire i test. A questo punto, il codice in
test_helper.js
è già stato eseguito e il test trae vantaggio dalla connessione creata.
Avviso importante La connessione a un database è un'operazione asincrona e attualmente non c'è nulla che garantisca che l'operazione asincrona in test_helper.js
sarà completato prima dell'inizio dei test. Che funzioni bene in questo momento è solo fortuna.
Se fossi in me, metterei la creazione della connessione in un before
asincrono globale gancio. (Un globale before
hook che appare in qualsiasi file di test verrà eseguito prima di qualsiasi test, anche test che appaiono in altri file. ) Oppure usare --delay
e chiama esplicitamente run()
per avviare la suite una volta stabilita la connessione.