segunda-feira, 11 de abril de 2016

Testando uma API Node.js/Express com Mocha

Os testes de unidade durante o desenvolvimento de uma aplicação são de extrema importância, garantindo que à medida que a aplicação é desenvolvida estejamos garantindo o funcionamento correto de cada modulo. Isto pode tornar o processo de desenvolvimento um pouco mais trabalhoso, mas, no entanto, evita muita dor de cabeça posteriormente.

Neste post vamos observar como é interessante irmos testando cada rota de nossa API REST à medida que a mesma é desenvolvida, através do módulo Mocha do Node.js que nos permite realizar testes assíncronos de maneira fácil.
Para tanto, vamos utilizar os seguintes módulos, além do Mocha:

  • chai, para asseveração (assertion) e
  • request, para fazermos as requisições para as rotas

Primeiramente é importante que tenhamos o Mocha instalado de forma global (indicado pelo flag -g do comando npm install):
npm install -g mocha

Agora vamos criar o projeto:
express teste-unidade-mocha
cd teste-unidade-mocha

Instale os módulos definidos em package.json
npm install

Vamos instalar os outros módulos necessários:
npm install mocha chai request --save-dev

Modifique o arquivo app.js para que o mesmo fique desta forma:

var express = require("express");
var bodyParser = require("body-parser");

var app = express();

app.use(bodyParser.urlencoded());
app.use(bodyParser.json());

var router = express.Router();

router.get('/produtos', function(req, res) {
  var produtos = [
    {
      id: 1,
      descricao: "Produto 1",
      categoria: 10
    },
    {
      id: 2,
      descricao: "Produto 2",
      categoria: 11
    },
    {
      id: 3,
      descricao: "Produto 3",
      categoria: 12
    }
  ];

  res.json(produtos);
});

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

  /* A forma como salvaríamos o produto no banco
   var produto = new Produto(req.body);
   produto.save(function(err, produto) {
    if(err)
      next(err); */
   
      res.json({mensagem: "salvo com sucesso", erro: false});

   //});


});

app.use('/', router);


module.exports = app;

Foram criadas duas rotas, uma que retorna uma lista de produtos e outra que "insere" um produto no banco. São estas rotas que vamos testar.

Crie um diretório na raiz da aplicação chamado test (por padrão é neste diretório que o Mocha procura os testes a serem executados), e dentro dele um arquivo chamado teste.js com o seguinte conteúdo:

var assert = require('chai').assert;
var request = require('request');

var url = "http://localhost:3000/produtos";

describe("Testando a API", function() {

    it("deve retornar 3 produtos", function(done) {
    request.get(url, function(err, res, body) {    
                // Foi retornada a quantidade correta de produtos?
    assert.equal(JSON.parse(res.body).length, 3);
                // Ja que estamos fazendo uma chamada assíncrona devemos nos assegurar que o Mocha vai aguardar o término da mesma chamando o callback "done".
    done();
    });
    });

    it("deve salvar um produto no banco", function(done) {
    request.post(url, {id:4, descricao:"Produto 4", categoria:100}, function(err, res, body) {    
                // Houve algum erro ao tentar inserir o produto?  
assert.equal(JSON.parse(res.body).erro, false);
    // Ja que estamos fazendo uma chamada assíncrona devemos nos assegurar que o Mocha vai aguardar o término da mesma chamando o callback "done".
                done();
    });
    });

});

Na pasta raiz do projeto digite:
npm start
Abra outro terminal, navegue até o diretório do projeto e digite:
mocha



Vamos simular um caso de erro.
No arquivo app.js, na rota post, altere o objeto passado para res.json() para que a propriedade erro seja true:
res.json({mensagem: "salvo com sucesso", erro: true});
Reinicie o servidor (npm start) e novamente digite:
mocha

E desta vez o teste falha.

Espero que este post tenha sido útil.
Abraço.



Nenhum comentário:

Postar um comentário