2
respostas

Limpando o banco para cada caso de teste

------------------------------------------------------------
//\AppNode\casadocodigo\test\produtos.js

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

describe('#ProdutosController',function(){

    console.log('passei aqui 1')

    beforeEach(function(done){

        console.log('passei aqui 2')

        var v_conn = v_express.infra.connectionFactory();

        console.log('passei aqui 3')

        v_conn.query("delete from produtos", function(err,result){
            if(!err) {
                done();
            }
        });
    });

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

        //v_request.get('http://localhost:3000/produtos')
        v_request.get('/produtos')
            .set('Accept','application/json')
            .expect('Content-Type',/json/)
            .expect(200,done);
        });

    it('#cadastro de novo produto com dados invalidos',function(done){
        v_request.post('/produtos')
        .send({titulo:"",descricao:"novo livro"})
        .expect(400,done);
    });

    it('#cadastro de novo produto com dados validos',function(done){
        v_request.post('/produtos')
        .send({titulo:"Titulo novo",descricao:"novo livro",preco:20.50})
        //deixadno o codigo de retorno 200 apresenta erro, porque
        //no caso do redirect o retorno é 302
        //.expect(200,done);
        .expect(302,done);
        });
    });

------------------------------------------------------------
// ./app/routes/produtos.js

//var v_connectionFactory = require('../infra/connectionFactory');
//este carregamento não é mais necessário, pois a coneção foi carregada no arquivo /config/express

module.exports = function (v_app) {

//res.send("<html><body><h1>Listagem de produtos</h1></body></html>") //tranferido para o arquivo ./views/produtos/lista.ejs
    console.log("atendendo a requisicao");
//  var v_listaProdutos = function (req, res) {

    v_app.get('/produtos', function (req, res,next) {
    //var v_connection = v_connectionFactory();
        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

        //este código foi para o arquivo app\infra\produtosBanco.js
        //v_connection.query('select * from produtos', function (err, results) {

        v_produtosDAO.lista(function (err, results) {
        //    res.send(results); neste formato não formata a tela
            //neste formata formata a tela
            //res.render('produtos/lista', {lista: results});

            //agora alteramos o código para trabalhar com diferentes tipos de resposta
            if(err){
                return next(err);
            }
            res.format({
                html: function () {
                    res.render('produtos/lista', {lista: results});
                },
                json: function () {
                    res.json(results);
                }
            });

        });

        v_connection.end();
    });

    //v_app.get('/produtos', v_listaProdutos);

    ////meu teste
    v_app.get('/produtos/form_excluir', function (req, res) {
        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

        v_produtosDAO.consulta(function (err, results) {
            res.render('produtos/form_excluir', {consulta: results});
        });

        v_connection.end();
    });
    ////

    v_app.get('produtos/remove', function () {
        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new app.infra.ProdutosDAO(v_connection);
        var v_produto = v_produtosDAO.carrega(id, callback);
        if (v_produto) {
            v_produtosDao.remove(v_produto, callback);
        }
    });

    v_app.get('/produtos/form', function (req, res) {
        res.render('produtos/form', {errosValidacao: {}, produto : {}});
    });


    v_app.post('/produtos', function (req, res) {

        var v_produto = req.body;

        // obrigado a informação do titulo do livro

        //atenção para isto funcionar:
        //é necessario importar "var expressValidator = require('express-validator');" no arquivo express.js
        //e informar "app.use(expressValidator());" no arquivo express.js

        // a função "assert" foi implementa na instalação do "npm install express-validator" 
        //pode ser assim
//      var v_validatorTitulo = req.assert('titulo','Titulo é obrigatório') 
//      v_validatorTitulo.notEmpty() // não aceita titulo vazio
        // ou assim que é o mais comum
        req.assert('titulo', 'Titulo é obrigatório').notEmpty();
        req.assert('preco', 'Formato inválido').isFloat(); // validação do formato do preço deve ser um float

        var v_erros = req.validationErrors();
        if (v_erros) {
            res.format({
                html: function () {
                    res.status(400).render('produtos/form', { errosValidacao : v_erros, produto : v_produto});
                },
                json: function () {
                    res.status(400).json(v_erros)
                }
            });    
            return;
        }
        // fim da validação do titulo

        console.log(v_produto);

        var v_connection = v_app.infra.connectionFactory();
        var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);

        v_produtosDAO.salva(v_produto, function (err, results) {
            //v_listaProdutos(req, res);

            //Exibindo a mensagem de erro no terminal!
            //if (err){
            //    console.log(err);
            //}

            console.log(err);

            res.redirect('/produtos');
        });

        v_connection.end();
    });
};
------------------------------------------------------------
// ./app/infra/connectionFactory.js
var v_mysql = require('mysql');

//module.exports = function (v_app) {
//    return v_mysql.createConnection({
//        host : 'LocalHost',
//        user : 'root',
//        password : 'Mrlf0101',
//        database : 'casadocodigo_nodejs'
//    });

function createDBConnection() {
    //if(process.env.NODE_ENV == 'development')
    if(!process.env.NODE_ENV){
        return v_mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password : 'Mrlf0101',
            database: 'casadocodigo_nodejs'
        });
    }

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

module.exports = function () {
    return createDBConnection;
};
------------------------------------------------------------

Quando executo o "mocha" esta ocorrendo o seguinte erro o banco foi criado: mysql> select * from casadocodigo_nodejs_test.produtos; Empty set (0.00 sec)

a variavel de ambiente foi "setada" NODE_ENV=test

C:\Caca\Alura\Node\AppNode\casadocodigo>mocha modulo ta sendo carregado atendendo a requisicao atendendo a requisicao passei aqui 1

ProdutosController

passei aqui 2 1) "before each" hook for "#listagem json"

0 passing (11ms) 1 failing

1) #ProdutosController "before each" hook for "#listagem json": ReferenceError: mysql is not defined at Object.createDBConnection [as connectionFactory] (app\infra\connectionFactory.js:24:16) at Context. (test\produtos.js:33:38)

2 respostas

Oi Luis, no arquivo connectionFactory você está usando a variável mysql quando deveria usar v_mysql.

Obrigado pela atenção, já havia repassado o código varias vezes e não tinha encontrado o erro.