Testes unitários são os aliados mais poderosos de qualquer projeto. Eles garantem a integridade estrutural e evitam que qualquer código seja posto em produção com alguma falha já testada.
No Node.js não poderia ser diferente, já que essa poderosa ferramenta conta com amigos à sua altura para ajudar na tarefa de testar o seu código.
Um pouco sobre o Mocha
O Mocha é um framework para testes extremamente flexível, simples e divertido. Ele se encaixa perfeitamente no seu estilo de testes, seja ele BDD ou TDD, síncrono ou assíncrono, usando o gerador de relatório que mais se adequa ao seu projeto.
Desenvolvido por TJ Holowaychuk, foi um dos primeiros frameworks para testes a se destacar na plataforma Node.js, sendo vastamente usado por vários desenvolvedores, e está listado entre os pacotes mais favoritados do npm.
Entre as alternativas ao Mocha podemos citar Jasmine, Expresso, NodeUnit, jsUnit e o Vows.
Estruturando o seu projeto
Primeiramente temos que pensar como será o melhor jeito de criarmos uma aplicação testável, e para isso podemos usar o conceito primordial de qualquer projeto designado para rodar na plataforma Node.js: pequenos módulos que juntos formam uma funcionalidade maior.
Classes grandes e funções com múltiplas funcionalidades podem ser complicadas de testar e até mesmo de dar a devida manutenção em um momento posterior. Tenha em mente que pequenos pedaços de código, que fazem somente uma tarefa, são facilmente reaproveitáveis, testáveis e muito menos propícios a falhas inesperadas.
Um projeto testável
Vamos iniciar um projeto simples, mas que tenha a capacidade de mostrar o Mocha atuando. Primeiramente vamos instalar todas as dependências:
# Crie um projeto em uma pasta vazia mkdir meu-projeto && cd meu-projeto && npm init # Logo após instale o Mocha globalmente sudo npm install -g mocha # Criamos as pastas principais do projeto mkdir test lib # Assim como o arquivo principal touch index.js test/general-test.js # Logo após abra o arquivo general-test.js # com o seu editor favorito vim general-test.js
Nesta aplicação, construiremos uma biblioteca capaz de executar os cálculos que são passados via linha de comando. Primeiramente vamos aos testes:
// Vamos usar a lib assert, que já
// vem no core do Node.js
var assert = require('assert');
// E também vamos incluir a lib
// da calculador, que criaremos mais tarde
var calculadora = require('../lib/calculadora');
// Descrevemos um tópico inicial usando
// o método describe() do Mocha
describe('Testes gerais da calculadora', function(){
// Dentro do tópico criamos os testes relacionados
// aos mesmos, fazemos isso usando o método it()
it('A calculadora deve ser uma função', function(){
// Usamos o assert.equal() para verificar se
// o tipo da variável 'calculadora' realmente
// é uma função
assert.equal(typeof calculadora, 'function');
});
it('O cálculo 191 * 7 deve ser igual a 1337', function(){
assert.equal(calculadora('191 * 7'), 1337);
});
});
Fácil e rápido, você já pode usar o comando mocha ./test/*-test.js para ver o que está de errado com sua aplicação, ou utilizar o parâmetro –reporter spec para ter um relatório mais agradável. Certamente o teste reclamou da ausência do arquivo../lib/calculadora.js, então vamos criá-lo:
// Vamos usar o módulo VM para compilar o input
// do usuário, lembre-se: evite o eval()
var vm = require('vm');
module.exports = function(calculo){
// Vamos executar o código que fora passado
// e retornar o seu resultado
return vm.runInNewContext('(function(){ return ' + calculo + '})()');
};
Agora, usando o Mocha, seus testes devem passar. Só está faltando o programa principal, vamos editar o index.js:
var calculador = require('./lib/calculadora');
var resultado = calculador(process.argv[2]);
console.log(resultado);
Executando node ./ ‘1 + 1’, você deve ver o output 2 em seu terminal.
Testes assíncronos
Utilizando um callback juntamente com o método it() do Mocha, é possível testar bibliotecas assíncronas:
it('Deve retornar um buffer', function(callback){
algumMetodoAsync(function(buff){
assert.ok(Buffer.isBuffer(buff));
callback() // Não esqueça de chamar o callback
});
});
Conclusão
Uma ferramenta tão flexível como o Mocha faz com que a plataforma Node.js ganhe mais confiança e agilidade nos projetos desenvolvidos com ela. Junte isso como módulo request e zombie, e você poderá fazer um teste de ponta à ponta: bibliotecas, API e frontend.
***
Artigo publicado originalmente na Revista iMasters de maio.



