2
respostas

Teste de inclusão de produto

Ao tentar realizar o teste de inclusão de produtos apareceu o seguinte erro: ReferenceError: D:\casadocodigo\app\views\produtos\lista.ejs:10 8|

Preço 9|

10| <%for(var i=0;i 11|

12| <%=lista[i].id%> 13| <%=lista[i].titulo%>

lista is not defined

verifiquei que realmente no teste não é passado o parametro lista, porem como ele deveria ter sido chamado pela rota não estendi o que pode estar acontecendo, abaixo segue os códigos do teste, produto.js e do lista.ejs

teste

var express = require('../config/express')();
var request = require('supertest')(express);
var DatabaseCleaner = require('database-cleaner');
var databaseCleaner = new DatabaseCleaner('mysql');

describe('#ProdutosController', function() {

    beforeEach(function(done) {
        databaseCleaner.clean(express.infra.connectionFactory(), function(){
            done();
        });
    });

    after(function(done) {
        databaseCleaner.clean(express.infra.connectionFactory(), function(){
            done();
        });
    });


    it('#listagem de produtos json', function (done) {
        request.get('/produtos')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200,done)

    });

    it('#listagem de produtos html', function (done) {
        request.get('/produtos')
            .expect('Content-Type', /html/)
            .expect(200,done)

    });

    it('#cadastro de novo produto com dados invalidos',function(done){
        request.post('/produtos')
            .send({titulo:"",descricao:"novo livro"})
            .expect(400)
            .expect(function(res) {
                if (true)
                    return console.log('Status esperado: 400');
            })
            .end(function(err, res){
                done(err);
            });
    });

    it('#cadastro de novo produto com dados validos',function(done) {
        request.post('/produtos')
            .send({titulo: "titulo", descricao: "novo livro", preco: 20.50})
            .expect(302)
            .expect(function (res) {
                if (true)
                    return console.log('Status esperado: 302');
            })
            .end(function (err, res) {
                done(err);
            });
    });

});

produto.js


module.exports = function (app) {


    app.get('/produtos' , function listaProdutos(req, res) {
        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        produtosDAO.lista(function (erros, resultados) {
            res.format({
               html: function () {
                   res.render('produtos/lista',{lista : resultados});
               },
               json: function () {
                   res.json(resultados);
               }
            });

        });
        connection.end();
    });


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

    app.post("/produtos",function(req,res) {
        var produto = req.body;

        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        req.assert('titulo', 'Titulo deve ser preenchido').notEmpty();
        req.assert('preco', 'Formato inválido').isFloat();


        var errors = req.validationErrors();
        if(errors){
            res.format({
                html: function () {
                    res.status(400).render('produtos/lista',{validationErrors:errors, produto: produto});
                },
                json: function () {
                    res.status(400).json(errors);
                }
            });
            return;
        }

        produtosDAO.salva(produto,function(erros,resultado){
            res.redirect("/produtos");
        });

        connection.end();

    });
}

e lista.ejs

<html>
    <body>
    <table border="1px">
        <tr>
            <td>Id</td>
            <td>Titulo</td>
            <td>Descrição</td>
            <td>Preço</td>
        </tr>
        <%for(var i=0;i<lista.length;i++) {%>
            <tr>
                <td><%=lista[i].id%></td>
                <td><%=lista[i].titulo%></td>
                <td><%=lista[i].descricao%></td>
                <td><%=lista[i].preco%></td>
            </tr>
        <%}%>
    </table>
    </body>
</html>
2 respostas

opa, como o código parece correto, não tem jeito, precisamos dar aquela debugada. quando vc acessa a rota pelo teste, ta caindo no case do html? e no do json ta caindo no do json? verifica tb se ta dando erro na execução do método da query!

Pela descrição do erro, o que ocorre é o seguinte, a variável "lista" existe na rota, mas, ela recebe o conteúdo dos resultados. Se houver problema ao receber os resultados, vai dar este erro de "undefined".

Para identificar o problema, precisa tratar os erros, segue um exemplo:

app.get('/produtos' , function listaProdutos(req, res) {
        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        produtosDAO.lista(function (erros, resultados) {
    //Tratamento de erro!
     if(erros){
           console.log(erros);
        return next(erros);
    }
            res.format({
               html: function () {
                   res.render('produtos/lista',{lista : resultados});
               },
               json: function () {
                   res.json(resultados);
               }
            });

        });
        connection.end();
    });