Não há uma ordem padrão de como o Mocha carrega os arquivos de teste.
Quando o Mocha verifica um diretório para encontrar os arquivos, ele usa
fs.readdirSync
. Esta chamada é um wrapper em torno de readdir(3)
, que por si só não garante a ordem. Agora, devido a uma peculiaridade de implementação
a saída de fs.readdir
e fs.readdirSync
é classificado no Linux (e provavelmente nos sistemas POSIX em geral), mas não no Windows . Além disso, é possível que o comportamento ordenado no Linux possa eventualmente ser removido porque a documentação diz fs.readdir
é apenas readdir(3)
e este último não garante a ordem. Há um bom argumento a ser feito de que o comportamento observado no Linux é um bug (veja o problema ao qual vinculei acima). Observe que existe um
--sort
opção que classificará os arquivos depois que o Mocha os encontrar. Mas isso está desativado por padrão. O comportamento que você observa é explicável não apenas pela ordem de carregamento, mas pela ordem de execução . Aqui está o que acontece:
-
O Mocha carrega os arquivos de teste e os executa. Portanto, tudo o que estiver no nível superior do seu arquivo será executado imediatamente . Isso significa que o código emtest_helper.js
executa imediatamente. Cada chamada paradescrever
executa imediatamente seu retorno de chamada. No entanto, chamadas parait
grave o teste para execução posterior. Mocha está descobrindo seus testes ao fazer isso, mas não executando eles imediatamente.
-
Uma vez que todos os arquivos são executados, o Mocha começa a executar os testes. A essa altura, o código emtest_helper.js
já foi executado e seu teste se beneficia da conexão que criou.
Aviso importante Conectar-se a um banco de dados é uma operação assíncrona e, atualmente, não há nada que garanta que a operação assíncrona em
test_helper.js
terá concluído antes do início dos testes. Que funcione bem agora é apenas sorte. Se fosse eu, eu colocaria a criação da conexão em um
antes
global assíncrono gancho. (Um global antes
hook que aparece em qualquer arquivo de teste será executado antes de qualquer teste, mesmo testes que aparecem em outros arquivos. ) Ou eu use --delay
e chamar explicitamente run()
para iniciar a suíte depois que a conexão for garantida.