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.