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

Como utilizar o express-load em teste de integração

Olá Pessoal, tudo beleza?

No projeto que estou trabalhando em Node.js com MySql, tenho utilizado o conceito do módulo "express-load". Durante o desenvolvimento, não havia colocado teste de integração e de unidade. Como o momento é propício, resolvi adicionar testes no projeto, o problema que estou tendo certas dificuldades para configurar no helpers da mesma forma que configurei no app.js.

Abaixo encontra-se a forma como estou desenvolvendo:

app.js

var load = require('express-load'); 
load("routes", { cwd: "app" })
        .then("controllers")
        .then("models")
        .then("services")
        .then("data")
        .into(app);

test/integration/helpers.js

var supertest = require('supertest');
var chai = require('chai');
var app = require('../../app');

global.app = app;
global.request = supertest(app);
global.expect = chai.expect;

test/integration/mocha.opts

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

test/integration/cliente.js

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

    const Cliente = new app.models.Cliente(),
        defaultCliente = {
            id: 1,
            nome: 'Default Cliente',
            telefone: '(12) XXXX-XXXX',
            email: 'teste1@outlook.com'
        };

    const cliente = new Cliente();
    beforeEach((done) => {
        cliente.esvaziar(() => {
            cliente.criar(defaultCliente, () => {
                done();
            });
        });
    });

    describe('Route GET /clientes', () => {
        it('deveria retornar lista de clientes', done => {
            request
                .get('/clientes')
                .end((err, res) => {
                    expect(res.body[0].id).to.be.eql(defaultCliente.id);
                    expect(res.body[0].nome).to.be.eql(defaultCliente.nome);
                    done(err);
                });
        });
    });
});
2 respostas

Acho que faltou você invocar o módulo depois de importado... Só tem esse código aqui:

var app = require('../../app');

Acho que faltou fazer var app = require('../../app')();

solução!

Era isso mesmo, Professor!!!! =)

Abaixo está a solução:

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(err);
                });
        });
    });
});

Vale ressaltar também que o expect estava ocasionando problema para concluir os testes, por isso, substitui pelo module assert.