Alterar tempo limite padrão para mocha


161

Se tivermos um arquivo de teste de unidade my-spec.js e em execução com o mocha:

mocha my-spec.js

O tempo limite padrão será 2000 ms. Pode ser substituído para teste parcial com um parâmetro de linha de comando:

mocha my-spec.js --timeout 5000

É possível alterar o tempo limite padrão globalmente para todos os testes? ou seja, o valor padrão do tempo limite será diferente de 2000 ms quando você chamar:

mocha my-spec.js

O site oficial do Mocha também explica mais sobre isso.
RaviRokkam

Respostas:


304

Por padrão, o Mocha lerá um arquivo chamado test/mocha.optsque pode conter argumentos de linha de comando. Então você pode criar um arquivo que contenha:

--timeout 5000

Sempre que você executar o Mocha na linha de comando, ele lerá esse arquivo e definirá um tempo limite de 5 segundos por padrão.

Outra maneira que pode ser melhor, dependendo da sua situação, é configurá-la dessa maneira em uma describechamada de nível superior no seu arquivo de teste:

describe("something", function () {
    this.timeout(5000); 

    // tests...
});

Isso permitiria definir um tempo limite somente por arquivo.

Você pode usar os dois métodos se desejar um padrão global de 5000, mas definir algo diferente para alguns arquivos.


Observe que você geralmente não pode usar uma função de seta se quiser ligar this.timeout(ou acessar qualquer outro membro thisque o Mocha defina para você). Por exemplo, isso geralmente não funciona :

describe("something", () => {
    this.timeout(5000); //will not work

    // tests...
});

Isso ocorre porque uma função de seta assume thiso escopo em que a função aparece. O Mocha chamará a função com um bom valor, thismas esse valor não será passado dentro da função de seta. A documentação para o Mocha diz sobre este tópico :

Passar as funções de flechas (“lambdas”) para o Mocha é desencorajado. Devido à ligação lexical disso, essas funções não conseguem acessar o contexto Mocha.


1
Obrigado pela informação. Mas eu tentei modificar o arquivo mocha.opts, mas isso não afeta.
lm.

2
Você criou no lugar certo? Mocha é muito específico sobre onde deseja esse arquivo. Se você executar o Mocha /home/me/src/proj/, o Mocha procurará esse arquivo:/home/me/src/proj/test/mocha.opts
Louis

Muito obrigado . Agora a mudança afetou
lm.

this.timeout (10000); // timeout padrão ^ TypeError: this.timeout não é uma função do Suite. <anônimo> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery

6
@JeffLowery Você está usando uma função de seta? As funções de seta não estabelecem um novo this, o que geralmente resulta em this.timeoutfalha, como você mostra em seu comentário.
Louis

62

Apenas adicionando à resposta correta, você pode definir o tempo limite com a função de seta da seguinte maneira:

it('Some test', () => {

}).timeout(5000)

7
A questão é "alterar o tempo limite padrão globalmente para todos os testes". Sua resposta muda apenas um teste. describe('suite', () => {...}).timeout(5000)não funciona
aleung

Como na resposta anterior, a solução proposta é atualmente ineficaz. mochajs.org/#timeouts diz para inserir setTimeoutinstruções explícitas dentro dos testes.
Marco Faustinelli

isso funcionou para mim com o mocha @ 5 (para um teste específico)
Fernando Gabrieli

@MarcoFaustinelli Você está entendendo mal os documentos. O setTimeouts não tem nada a ver com o Mocha. Eles estão lá para demonstrar os efeitos das configurações de tempo limite.
oligofren 10/03

33

Adicionando isso para completar. Se você (como eu) usa um script em seu package.jsonarquivo, basta adicionar a --timeoutopção ao mocha:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

Em seguida, você pode executar npm run testpara executar seu conjunto de testes com o tempo limite definido para 10.000 milissegundos.


Caso alguém esteja interessado, a maioria dos IDEs também permite que você injete opções de mocha para execução de teste; por exemplo, para o WebStorm, você pode inserir isso (por exemplo, "- timeout 10000") em Executar-> Editar configurações-> Opções adicionais do Mocha.
Rubicon

25

Nas versões atuais do Mocha, o tempo limite pode ser alterado globalmente assim:

mocha.timeout(5000);

Basta adicionar a linha acima em qualquer lugar do seu conjunto de testes, de preferência na parte superior da sua especificação ou em um auxiliar de teste separado.


Nas versões mais antigas, e apenas em um navegador, você pode alterar a configuração global usando mocha.setup.

mocha.setup({ timeout: 5000 });

A documentação não cobre a configuração de tempo limite global, mas oferece alguns exemplos de como alterar o tempo limite em outros cenários comuns.


5
Isso não funciona no nó. Consulte stackoverflow.com/a/47915119/893113 . Parece que a opção CLI é a única maneira.
paulmelnikow

Também não trabalho no navegador. Até hoje, a documentação vinculada na resposta não menciona nenhum timeoutparâmetro. Pelo contrário, mochajs.org/#timeouts diz para inserir setTimeoutinstruções explícitas dentro dos testes.
Marco Faustinelli

@MarcoFaustinelli Você está entendendo mal os documentos. O setTimeouts não tem nada a ver com o Mocha. Eles estão lá para demonstrar os efeitos das configurações de tempo limite.
oligofren 10/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.