Como aumentar o tempo limite para um único caso de teste no mocha


405

Estou enviando uma solicitação de rede em um caso de teste, mas às vezes isso leva mais de 2 segundos (o tempo limite padrão).

Como aumentar o tempo limite de um único caso de teste?

Respostas:


669

Aqui está: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Para a função de seta, use o seguinte:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
o tempo limite está em milissegundos e o padrão é 2000.
Ethan Mick

47
Eu estava usando as funções de seta es6 e tive que voltar às definições antigas de 'function' para que "this" funcionasse.
Aruna Herath

11
Também funciona para ganchos, comobefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH A razão a função de seta não funcionou por causa de lexical este
Tanner Faulkner

11
existe uma maneira de fazê-lo funcionar com a função de seta? edit: adicionar .timeout(500)ao final deit(...).timeout(500)
chovy

136

Se você deseja usar as funções de seta es6, pode adicionar um .timeout(ms)no final de sua itdefinição:

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

Pelo menos isso funciona no texto datilografado.


3
Isso funciona, mas .timeoutnão está incluído nas tipagens DefinitelyTyped para mocha: i.imgur.com/jQbWCn1.png - Usando this.timeout(2000)ou this.slow(500)com um regulares obras função antiga e compila sem erros
Leon Adler

3
Infelizmente, isso só funciona it, não funciona describe.
robrich

3
existe uma maneira de fazer isso para describe()ou context()?
Chovy

11
@LeonAdler .timeoutagora está incluído no tipagens Mocha do DefinitelyTyped em: Mocha.IRunnable. No entanto, se você estiver usando o IDE Webstorm para executar esses testes, observe: por qualquer motivo, o plug-in de integração Mocha do WebStorm ainda não reconhece os testes Mocha com .timeout()anexado (o que significa que nenhum botão 'executar' aparece ao lado deles), e, portanto, defendo evitar as funções de seta para permitir o uso this.timeout().
Jamie Birch

Isto é perfeito. Para a função assíncrona retornando uma promessa, você pode deixar de fora done ().
billoverton 19/02

72

(desde que eu me deparei com isso hoje)

Cuidado ao usar a sintaxe de seta gorda do ES2015:

Isso irá falhar:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

EDIT: Por que falha:

Como @atoth menciona nos comentários, as funções de seta gorda não possuem essa vinculação. Portanto, não é possível que a função it se vincule a isso do retorno de chamada e forneça uma função de tempo limite .

Conclusão : não use as funções de seta para funções que precisam de um tempo limite aumentado.


2
Porque as funções de seta não têm isso. Leia mais aqui: blog.getify.com/arrow-this
atoth 29/04

2
Sim, mas expliquei isso na resposta. Veja meu comentário. // dentro do código. Eu provavelmente deveria explicá-lo fora do bloco de código para torná-lo mais claro. isso existe, mas vem do escopo externo.
Chriskelly

11
Minha explicação é mais precisa. Não há thisvinculação nas funções das setas - não da mesma maneira sugere que elas tenham algum tipo, apenas diferente. Eles só têm escopos lexicais. Você não pode vincular isso inexistente. É por isso que .bind, .calletc. não funciona com isso.
Atoth 29/04

11
Isso é verdade - e seu direito é mais preciso. Graças
chriskelly

11
Eu diria que é por isso que você só deve usar flechas grossas quando precisar delas, mas perdi a noção do que thisé.
xdumaine 26/09/16

42

Se você estiver usando no NodeJS, poderá definir o tempo limite no package.json

"test": "mocha --timeout 10000"

então você pode executar usando o npm como:

npm test

11
Isso é para todos os casos de teste, nem um único caso de teste
garryp

Concordei que isso não responde à pergunta, mas foi suficiente para o meu caso de uso em que não me importei se aumentasse para todos os testes. Eu acho que muitas pessoas que acabam aqui talvez não se importem se é para um ou todos os testes, então eu aprecio essa resposta por estar aqui.
billoverton

22

Na linha de comando:

mocha -t 100000 test.js

14
Isso aumenta o tempo limite para todos os casos de teste, em vez de "para um caso de teste específico", como a pergunta.
Louis

16

Você também pode pensar em adotar uma abordagem diferente e substituir a chamada do recurso de rede por um stub ou objeto simulado. Usando o Sinon , você pode separar o aplicativo do serviço de rede, concentrando seus esforços de desenvolvimento.


7
Não é totalmente irrelevante; freqüentemente, faz sentido stub a resposta da rede para que você não confie na máquina que está sendo instalada ou retornando a resposta correta. Se você estiver testando a resposta em si, no entanto, sim, ainda precisará fazê-lo.
aendrew

2
Estou usando o sinon / mocha para criar alguns testes de integração, portanto, tempos limite mais altos são relevantes.
jcollum

9

Para navegação de teste em Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

No exemplo, o tempo de teste é 4000 (4s).

Nota: setTimeout(done, 3500)é menor pelo que doneé chamado dentro do tempo do teste, mas clearTimeout(timeOut)evita que seja usado o tempo todo.


2

Isso funcionou para mim! Não foi possível encontrar nada para fazer funcionar antes ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout () funcionou perfeitamente!
acidjazz 8/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.