3
respostas

Não roda o teste redirecionando para o banco de teste

Fiz as devidas adequações, criei o banco de teste e tabela corretamente, porém quando rodo dá timeout.Até antes do redirecionamento para o banco de teste estava tudo funcionando. Voltei e retirei o redirecionamento dos bancos e apresenta a mesma mensagem. Se faço pela página grava o novo registro e lista corretamente. Estou usando o done, conforme sugerido na mensagem.

Eis a mensagem completa:

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (D:\Estudos\Alura\casadocodigo\test\produto.js)

Podem me ajudar?

3 respostas

Olá, Marcos.

Como está o código da sua connectionFactory.js?

Olá Marco, Meu ConnectionFactory está como abaixo, e mesmo que direcione apenas para o banco casadocodigo_nodejs, ocorre o mesmo problema:

var mysql  = require('mysql');

function createDBConnection(){

    //if(!process.env.NODE_ENV) {
    if(process.env.NODE_ENV != "test") {
        return mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'casadocodigo_nodejs'
        });
    }

    if(process.env.NODE_ENV == 'test') {
        return mysql.createConnection({
            host:'localhost',
            user:'root',
            password:'',
            database:'casadocodigo_nodejs_test'
        });
    }
}

module.exports = function() {
    return createDBConnection;

}

Não se se interefere alguma coisa, mas no meu \Estudos\Alura\casadocodigo\package.json, está assim:

{
  "name": "casadocodigo",
  "version": "1.0.0",
  "description": "Casa do Código",
  "main": "index.js",
  "scripts": {
    "start": "set NODE_ENV=test node node_modules/mocha/bin/mocha",
    "test": "mocha"
  },
  "author": "Marcos",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.3",
    "ejs": "^2.6.1",
    "express": "^4.16.3",
    "express-load": "^1.1.16",
    "express-validator": "^5.2.0",
    "mysql": "^2.15.0"
  },
  "devDependencies": {
    "mocha": "^5.2.0",
    "nodemon": "^1.17.4",
    "supertest": "^3.1.0"
  }
}

Já a programação dos testes ficou assim:

var express = require('../config/express')();  // declarou um objeto express e carregou - invocando a function "()"
var request = require('supertest')(express);   // passou toda configuração do express que faz o carga do servidor (em express)

    describe('ProdutosController',function(){
        // antes de executar o teste, vai executar uma série de processos que podem ser programados
        beforeEach(function(done){
            var conn = express.infra.connectionFactory();
            conn.query("delete from produtos", function(ex, result){
                if(!ex) {
                   done();
                }
             });

    });

    it('listagem json',function(done){         // o done indica o inicio das requisições q serao passadas (de teste)
        request.get('/produtos')               // fazendo um get na rota "produtos"
            .set('Accept','application/json')  // verifica se esta recebendo um json
            .expect('Content-Type',/json/)     // verifica o Content-Type
            .expect(200,done);                 // verifica o status retornado e o "done" indica que o fim das requisições podendo devolver o retorno
    });

    it('#cadastro de novo produto com dados inválidos', function(done){
        request.post('/produtos')
            .send({titulo:"", descricao:"novo livro"})  // passando os argumentos q serao usados para o post de teste
            .expect(302, done);                         // seria 400, mas como existe um redirecionamento o status 302 que indica q está tudo ok e passa o done para finalização
    });

    it('#cadastro de novo produto com preço', function(done){
        request.post('/produtos')
            .send({titulo:"xxxxx", descricao:"novo livro", preco:20.50})  // passando os argumentos q serao usados para o post de teste
            .set('Accept','application/json')                             // verifica se esta recebendo um json
            .set('Content-Type','application/json')                       // verifica se esta recebendo um json
            .expect(302, done);                                           // espera o status 302 que é teste experado
    });

});

Marcos.

Quando você roda os testes está passando a variável de ambiente:

NODE_ENV=test mocha arquivoComCodigoDeTeste.js

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