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

Supertest e Express.js não finalizam

Olá!!!

Na ultima dúvida que postei aqui, no final afirmei algo que não está correto. Mais detalhes acessem esse link: https://cursos.alura.com.br/forum/topico-como-utilizar-o-express-load-em-teste-de-integracao-49874

Quando tenho apenas um aquivo .js de teste de integração tudo funciona que uma beleza. Já para um cenário onde tenho vários aquivos de teste de integração, os testes não finalizam.

Alguém já passou por isso?

Abaixo está o código:

test/integration/cliente.js

describe('Routes clientes', () => {

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

    const defaultCliente = {
        id: 1,
        nome: 'Default Cliente',
        email: "test@outlook.com",
        telefone: "(12) 3204-5611"
    };

    beforeEach((done) => {
        const _controller = new express.controllers.Cliente();
        _controller.data
            .destroy({ where: {} })
            .then(() => _controller.data.create(defaultCliente))
            .then(() => done());
    });

    describe('Route GET /cadastros/clientes', () => {
        it('deveria retornar lista de clientes', (done) => {
            request
                .get('/cadastros/clientes')
                .set('Accept', 'application/json')
                .end((err, res) => {
                    assert.equal(res.statusCode, 200);
                    assert.equal(res.headers['content-type'], 'application/json; charset=utf-8');
                    done();
                });
        });
    });
});

test/integration/fornecedor.js

describe('Routes fornecedores', () => {

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

    const defaultFornecedor = {
        id: 1,
        nome: 'Default Fornecedor',
        email: "test@outlook.com",
        telefone: "(12) 3204-5611"
    };

    beforeEach((done) => {
        const FornecedorController = new express.controllers.Fornecedor();
        FornecedorController.data
            .destroy({ where: {} })
            .then(() => FornecedorController.data.create(defaultFornecedor))
            .then(() => done());
    });

    describe('Route GET /cadastros/fornecedores', () => {
        it('deveria retornar lista de fornecedores', (done) => {
            request
                .get('/cadastros/fornecedores')
                .set('Accept', 'application/json')
                .end((err, res) => {
                    assert.equal(res.statusCode, 200);
                    assert.equal(res.headers['content-type'], 'application/json; charset=utf-8');
                    done();
                });
        });
    });
});

gulpfile.js

var gulp = require('gulp');
var mocha = require('gulp-mocha');

gulp.task('default', function () {
    process.env.NODE_ENV = 'test';
    gulp.src('test/integration/*.js')
        .pipe(mocha({
            timeout: 15000,
            reporter: 'mocha-junit-reporter',
            reporterOptions: {
                mochaFile: './TEST-RESULTS.xml'
            }
        }));
});
3 respostas

Olá, Diogo.

Eu não tenho um conhecimento bom em gulp. Você já rodou todos os arquivos pelo npm script ou direto no terminal com o comando abaixo?

mocha --recursive test/

Olá Professo!

As configurações para mocha, encontra-se assim:

test/integration/mocha.opts

--require test/integration/helpers.js
--reporter spec
--compilers js:babel-core/register
--slow 5000
--recursive test/

package.json

"test-integration": "mocha --opts test/integration/mocha.opts test/integration/*.js"

Quando executei, o resultado continua da mesma forma.

Estou colocando abaixo a configuração que fiz para o sequelize.js, acredito que talvez possa ser interessante conhecer essa parte também:

data/Datasource.js

var Sequelize = require('sequelize');
var fs = require('fs');
var path = require('path');

var database = null;

module.exports = app => {
    class Datasource {

        instanciar() {

            if (!database) {
                var config = this.getConfig();

                var sequelize = new Sequelize(config.database, config.username, config.password, config.params);

                database = { sequelize, Sequelize, models: {} };

                database.models = this.carregarModels(sequelize);
                sequelize.sync().done(() => database);
            }

            return database;
        }

        getConfig() {
            var config = new app.data.Config();
            if (!process.env.NODE_ENV || process.env.NODE_ENV == 'development') {
                config = config.getDevelopment();
            } else if (process.env.NODE_ENV == 'production') {
                config = config.getProduction();
            } else if (process.env.NODE_ENV == 'test') {
                config = config.getTest();
            }
            return config;
        }

        carregarModels(sequelize) {
            var dir = path.join(__dirname, '../models');
            var models = [];
            fs.readdirSync(dir).forEach(file => {
                var modelDir = path.join(dir, file);
                var model = sequelize.import(modelDir);
                models[model.name] = model;
            });
            return models;
        }
    }

    return Datasource;
}
solução!

Olá Pessoal!

Passou por aqui apenas para deixar a solução encontrada. O problema de não concluir os testes ocorria porque eu havia iniciado o server mais de uma vez. Um no helpers.js e outro nos testes de integração. Quando concluía os testes, o outro servidor ainda permanecia de pé. =/

Obrigado pela atenção!