Desenvolvimento

4 jun, 2014

Testando seu código Node com o Mocha

Publicidade

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 JasmineExpressoNodeUnitjsUnit 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 requestzombie, e você poderá fazer um teste de ponta à ponta: bibliotecas, API e frontend.

***

Artigo publicado originalmente na Revista iMasters de maio.