MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como o Mocha sabe qual arquivo carregar primeiro na suíte de testes


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:

  1. 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 em test_helper.js executa imediatamente. Cada chamada para descrever executa imediatamente seu retorno de chamada. No entanto, chamadas para it grave o teste para execução posterior. Mocha está descobrindo seus testes ao fazer isso, mas não executando eles imediatamente.

  2. Uma vez que todos os arquivos são executados, o Mocha começa a executar os testes. A essa altura, o código em test_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.