Testes unitários e javascript – parte 2

Olá pessoal, tudo certo!?

Continuando o post anterior, agora vamos para a parte final da calculadora. Neste post iremos tratar da subtração, divisão e das expressões que havíamos deixado como objetivo no começo.

É hora de continuar com os testes, o próximo é a subtração.

Rodamos os testes, e novamente eles falham. Agora vamos fazer o mínimo para que eles funcionem. Como você deve ter imaginado, foi simplesmente adicionar a opção ‘-‘ ao array de operações no método parse e a o case no método calculate.

Os testem funcionam, é hora de refatorar. A refatoração que me vem em mente é a redundância dos operadores nos métodos parse e calculate. É ruim ter que adicionar em ambos os métodos cada novo operador que for adicionado à nossa calculadora.

Após uma rápida refatoração chegamos ao código acima. Retiramos as redundâncias de operadores agrupando-os em um objeto (com a funcionalidade de um hash table) com suas respectivas funções. Desta forma a adição de novas operações se torna simples.

Antes de irmos para o teste de divisão, vamos escrever um teste com a subtração para saber se a ordem dos operadores está correta.

O teste não passa. Isso ocorre porque o método unshift do array sempre adiciona o valor no início. Para isso iremos trocar o método unshift para o método push no else do método parse.

E o teste passa. Agora podemos testar a divisão.

Como já esperávamos, o teste falha. Desta vez fazê-lo funcionar é simples, basta apenas adicionar o método para divisão na nossa hash table de operações.

O objeto deverá ficar como no exemplo acima. Não precisamos adicionar um teste para garantir que ‘0 2 /’ seja realmente ‘0 / 2’ e o resultado deve ser 0. Já fizemos isso com a subtração. Vamos apenas garantir que ao dividir por zero seja lançada uma exceção.

O teste não passa. Em javascript quando se divide por zero, o resultado é o valor Infinity. Vamos implementar o código para que seja lançada a exceção ao dividir por zero.

Agora nossa calculadora suporta as 4 operações básicas. Vamos adicionar um teste com uma expressão envolvendo todas as 4 operações, ou seja, a primeira expressão que era o nosso objetivo.

Os testes falham. Vamos codificar para resolver o problema em questão no teste. A calculadora não prevê uma grande expressão e sempre retorna o valor calculado inicialmente. Para contornar este problema, precisamos enfileirar novamente o valor calculado. Para que o teste passasse foi necessário alterar o método calculate e o método parse.

E agora nossa calculadora está funcionando com a primeira expressão de teste. Vamos adicionar o teste para a nossa segunda expressão e ver o resultado.

Nosso teste não falha, ou seja, nossa calculadora está pronta 🙂

Agora vamos para a última refatoração.

Foram feitas grandes mudanças no código, mas a funcionalidade se mantém graças aos testes que escrevemos. Para revisar o que foi feito, retiramos as “filas” que utilizavam métodos de pilhas, e transformamos a fila de números em uma pilha. Retiramos um laço de repetição, mantendo apenas a necessidade de percorrer a expressão, e não a expressão e as estruturas de dados. Substituímos o método parse por outros dois métodos mais dirigidos.

Criei um fiddle simples com a implementação final para quem quiser ver o resultado. Abaixo seguem os fontes dos testes. Mais tarde devo colocar no github os fontes do post, e daí atualizo por aqui. 🙂

UPDATE: Fontes no github 😀

Código final do arquivo com os testes do Jasmine.

Código final do arquivo com os testes do Qunit.

É isso pessoal, espero que tenham gostado 😀

Anúncios

Um pensamento sobre “Testes unitários e javascript – parte 2

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s