Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.