Escolar Documentos
Profissional Documentos
Cultura Documentos
44 Javascript
44 Javascript
br : :
Caíres Vinicius
(caires.santos@caelum.com.br): é desenvolvedor e consultor pela
Caelum nas linguagens em Java, Ruby e Javascript. Entusiasta de
usabilidade para Web e Javascript Server-side.
Lucas Souza
(lucas.souza@caelum.com.br): é bacharel em Engenharia da
Computação pela Universidade de Ribeirão Preto, possui a
certificação SCJP e trabalha com Java há 4 anos. Atualmente é
desenvolvedor e instrutor pela Caelum. Entusiasta de metodologias
ágeis e editor-chefe do InfoQ Brasil.
ódigo JavaScript tem se tornado cada vez mais frequente precisamos alterar estes códigos temos uma dificuldade imensa.
em aplicações web ricas, as ditas aplicações web 2.0.
Bibliotecas como jQuery, Prototype, Mootools e outras Em relação a nossa aplicação, a primeira opção prioriza a fun-
facilitam muito o trabalho dos desenvolvedores. Porém o código cionalidade, isto é, deve funcionar com ou sem javascript. Essa
muitas vezes acaba não recebendo a atenção necessária, e os pro- solução é conhecida como Graceful Degradation. Garantir que a
blemas são descobertos ou pelos usuários das aplicações ou pelos aplicação funcione sem javascript vai gerar uma perda de usabi-
desenvolvedores quando utilizam ferramentas de debugging no lidade.
estilo do Firebug. Mesmo com essas ferramentas e com a correção
de erros sendo feita frequentemente, não temos muito cuidado O objetivo do artigo é mostrar que testes em códigos JavaScript
no processo de isolar determinados códigos assim como é feito são fáceis de fazer e hoje em dia existem muitas ferramentas que
quando nos referimos a códigos no server side. nos auxiliam em processos complexos, como a criação de mocks e
O código termina como uma big ball of mud, ou uma grande stubs, além da integração destes testes com servidores de integra-
“bola de lama”, onde misturamos códigos que manipulam a ár- ção contínua. Com isso, obtemos códigos mais legíveis e coesos e,
vore DOM, código de chamadas Ajax para o servidor. Quando evidentemente, com menor número de bugs.
46
Testes de unidade com QUnit Listagem 1. Criação do teste utilizando Qunit.
Vamos primeiro simular um cenário no qual devemos calcular <html>
alguns impostos e mostrar o resultado para o usuário. Poderíamos <head>
resolver o problema de duas maneiras: <link rel=”stylesheet” href=”qunit.css” type=”text/css” media=”screen” />
•Uma requisição no server side para calcular nosso imposto e re- <script type=”text/javascript” src=” qunit.js”></script>
tornar a página preenchida com o valor. <script type=”text/javascript” src=”impostos.js”></script>
•Um código JavaScript que calcula o valor do imposto, sem ne-
nhuma requisição feita no server side. <script>
window.onload = function() {
Pensando em cada vez mais melhorar a usuabilidade e a experi- test(“calcula imposto corretamente”, function() {
ência do usuário em relação a nossa aplicação, ou seja, pensando equals(5.7, Imposto.calcula(10.20, 0.5, 0.6));
na questão do graceful degradation, a primeira opção é mais re- });
comendada. Porém, é uma solução que possui um problema, que }
pode ser uma resposta lenta ao usuário. </script>
Em nosso primeiro código, adotaremos a abordagem de Test- Listagem 2. Criação do cálculo de impostos.
Driven Development, que é uma excelente prática de desenvol-
vimento, e que já é seguida fortemente quando testamos códigos Imposto.calcula = function(valor, imposto, taxa) {
server side. Vamos começar pela criação de um teste e depois return (valor * imposto) + taxa;
}
escreveremos o código javascript para que este teste passe.
47
: : www.mundoj.com.br : :
48
Na Listagem 7 simulamos uma requisição que quando efetuada com
Listagem 6. Testando o caso de erro. sucesso deve nos retornar um HTML que vai ser tratado por uma fun-
ção criada por nos chamada callback que recebe como argumento data
it(“mockando uma requisicao ajax com erro”, function() {
que nada mais é que a resposta da requisição em texto. No exemplo aci-
var resultado, httpStatus;
ma verificamos se uma parte da árvore DOM dos nossos componentes
Smoke.Ajax.mock(“/produto”, “<p>Oops</p>”, 500);
$.ajax( {
foram alterados de acordo com o que esperávamos. Ainda utilizando o
url : “/produto”, exemplo da Listagem 7 podemos testar de outra maneira a alteração na
success : function(data, textStatus) { árvore DOM usando apenas a função callback sem precisar simular a
resultado = data; requisição Ajax, como é mostrado na Listagem 8.
httpStatus = textStatus;
},
error : function(error) {
Listagem 8. Testando callback há alteração de um elemento
resultado = error.responseText; na árvore DOM.
httpStatus = error.status;
<script type=”text/javascript”>
} Screw.Unit(function() {
}); describe(“Preenche na div um html”, function() {
it(“testando callback de um ajax”, function() {
wait(function() { $(“#contentAjax”).html(“”);
expect(resultado).to(equal, “<p>Oops</p>”); var html = “<span>Camiseta Amarela</span>”;
expect(httpStatus).to(equal, 500); callback(html);
}, 50); expect($(“#contentAjax”).html()).to(equal, html);
}); });
});
});
No exemplo acima, definimos dentro do método wait, que ele </script>
deve retornar na variável resultado um valor igual a "<p>Oops</
p>" e dentro da variável httpStatus, um código igual a 500. Apenas
simulamos o comportamento da requisição Ajax usando um mock. Verificar que um elemento foi alterado e que seu Ajax está seguindo
O exemplo que utilizamos foi apenas para demonstrar a possibili- o fluxo dos métodos de callback de sucesso e de erro é importante.
dade que o Smoke junto ao Screw.Unit nos oferece para usar um Conseguimos testar nosso código Javascript, independentemente
mock de uma requisição Ajax. Utilizando uma lógica de modifica- de chamadas ao server side. Focamos apenas no que realmente in-
ção do DOM como ficaria nosso teste? teressa, no client side da aplicação, no que é feito quando obtemos
o resultado.
49