Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Problema ao executar o teste.

Ao tentar executar o teste da aplicação é retornada a seguinte mensagem:

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

10 respostas

Oi Gilmar, o teste tá demorando pra retornar uma resposta. Você tem a chamada da função done() no seu código? Posta ele aqui pra gente dá uma olhada?

var http = require('http');
describe('ProdutosController', function () {
     it('listagem json', function (funcaoFinalizacao) {
        var configuracoes = {
            hostname: 'localhost',
            port: 3000,
            path: '/produtos',
            headers: {
                'Accept': 'application/json'
            }
        };
        http.get(configuracoes, function (res) {
            if (res.statusCode == 200) {
                console.log("Status ta ok");
            }

            if (res.headers['content-type'] == 'application/json;charset=utf-8') {
                console.log("Content type ok");
            }
            funcaoFinalizacao();
        });
    });
})

Oi Gilmar, tudo bem? Aparentemente você não pode trocar o nome da função done pra funçãoFinalizacao por que done é o nome esperado pela biblioteca de teste, experimenta trocar isso pra ver se funciona?

Olá Wanderson, eu realizei este teste mesmo assim o problema persistiu. Acabei encontrando o erro em outra parte do código.

Obrigado.

O problema foi resolvido Gilmar? Qual foi a solução?

Sim foi resolvido. O erro estava na query do mysql em outro arquivo.

Aproveitando o fórum aqui, quanto a função done que você mencionou.

Veja o exemplo abaixo:

var express = require('../config/express')
var request = require('supertest')(express);

describe('#ProdutosController', function () {
    it('#listagem json', function (done) {

        request.get('/produtos')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200);
            done();
    });

//Forma 2

    it('#listagem json', function (done) {

        request.get('/produtos')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200,done);
    });

});

Aparentemente os dois códigos fazem a mesma coisa, no final da execução chamam a função done, porém no segundo exemplo ele ultrapassa o tempo limite, sendo assim a única forma que funciona é quando chamo a função done separadamente, existe algum motivo para isso ?

solução!

A diferença é quando a função done é chamada, perceba que, no primeiro caso, você executa a função done e no segundo caso, você repassa a função done para que outra função execute a mesma.

O que pode acontecer é que no primeiro caso, o teste tenha sido encerrado antes do expect realmente receber o resultado e como o done não recebeu nenhum erro, fez o teste passar.

No segundo caso, como o done vai ser executado pelo expect, o teste demora a passar, ultrapassando o tempo requerido ou também, recebendo um erro internamente fazendo o teste não passar.

Testar código assíncrono pode apresentar esses problemas, e ai, você deve pensar, tem algum outro comportamento acontecendo que faz algo errado acontecer?

Entendo, realmente isso esta acontecendo, ele não espera o resultado do expect e deixa passar como resolvido, vou analisar o resto do código então.

Valeeeu

Precisando, posta o código que a gente vê junto.

Acredito que o problema seja porque você esqueceu de chamar o express

Ao invés de:

var express = require('../config/express');

Deveria ser:

var express = require('../config/express')();

Isso fez com que a função done() não fosse invocada, causando o erro.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software