MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come Mocha sa quale file caricare per primo nella suite di test

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:

  1. 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 a describe esegue immediatamente la sua richiamata. Tuttavia, chiama a it registrare il test per l'esecuzione successiva. Mocha sta scoperta i tuoi test mentre esegui questa operazione ma non esegui subito.

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