Javascript - Criando um módulo Ajax com Promises - Parte 2
E então, fez sua lição de casa proposta no post anterior? xD
Vamos então dar continuidade no nosso módulo, para que possamos trabalhar com Ajax de forma organizada, e sem depender de módulos de terceiros o/
Nosso próximo passo é testar se nosso módulo tem os métodos post
, put
e delete
.
No arquivo tests/test.ajax.js
, vamos criar um novo teste, logo após o teste do get
:
1 | it( 'Should have `post` method', function() { |
Testamos agora pelo método post
. É óbvio que ele não existe, mas é por isso que esse teste chama-se TDD, não? Primeiro testamos se algo existe, para que o teste falhe, e logo após, fazemos sua implementação, com o mínimo de código possível.
Vamos então adicionar no arquivo src/ajax.js
, logo após o método get
:
1 | $public.post = function post() {}; |
E o nosso teste passa! Agora ficou fácil, não? Vou deixar então pra você criar os métodos put
e delete
;)
Lembrando que você pode acompanhar o desenvolvimento desse módulo aqui.
Só um detalhe sobre o método delete
: como delete
é um operador válido em Javascript, você não pode utilizá-lo como nome de variável ou função, mas pode usá-lo como método ou propriedade de um objeto. Então, vamos nomear nossa função somente como del
, no arquivo src/ajax.js
:
1 | $public.delete = function del() {}; |
Assim não teremos problemas ;)
Certo, e qual é o próximo passo?
Ainda não testamos o retorno dos nossos métodos. Ainda dentro dos testes de interface do nosso módulo, precisamos garantir que eles retornem os métodos done
e error
. Esses métodos ainda não precisamo funcionar, só precisamos ter certeza que eles serão retornados, já que estamos falando de Promises :)
Criaremos um novo teste então, verificando se o nosso método get
retorna esses dois outros métodos. No arquivo tests/test.ajax.js
:
1 | it( 'Should `get` method return `done` method', function() { |
Testamos primeiro pelo método done
. Ele ainda não existe, logo nosso teste falha. Vamos então criá-lo:
1 | $public.get = function get() { |
É só isso? Retornar um método done
vazio?
Sim! Não é isso que o nosso teste pede: um método done
? Então é isso que damos a ele :)
Precisamos sempre pensar simples, para dar somente o código necessário que o nosso teste precisa, e fazê-lo passar. A funcionalidade do método será feita depois, logo, ela será testada depois, então não precisamos nos preocupar com ela agora.
Dessa forma você mantém seus códigos com o mínimo de código possível, fazendo com que tudo fique tão limpo quanto possível :D
Agora precisamos testar o método error
. No arquivo de testes test/test.ajax.js
, vamos fazer a asserção para esse método:
1 | it( 'Should `get` method return `error` method', function() { |
Então, escrevemos o código para que nosso teste passe. Em src/ajax.js
:
1 | $public.get = function get() { |
Adicionamos o método error
, para que seja retornado por get
e nosso teste volta a passar!
Mas e os outros métodos?
Então, todos os nossos métodos precisam retornar os mesmos métodos done
e error
. Vamos agora testar próximo método, post
, para que ele também retorne as Promises done
e error
. Começamos por done
. No arquivo tests/test.ajax.js
:
1 | it( 'Should `post` method return `done` method', function() { |
Nosso método post
também deveria retornar done
- assim diz o teste, que por sinal, falhou. Vamos então fazê-lo retornar o método done
. No arquivo src/ajax.js
:
1 | $public.post = function post() { |
E nosso teste volta a passar! Mas perceba uma coisa: o retorno do método post
é exatamente igual - ou está se encaminhando para ser igual - ao retorno do método get
. Como todos os nossos testes até aqui passaram, vamos parar de criar funcionalidades e aplicar o BLUE, fazendo um refactory. No arquivo src/ajax.js
:
1 | function Ajax() { |
A função Ajax
do nosso módulo agora ficou um pouco mais limpa: removemos a duplicidade do código, criando um método $private.promises
, que retorna os métodos da Promise - done
e error
.
Deixamos o método promises()
no objeto $private
, pois não precisamos que ele seja acessado através da interface do nosso módulo. Ou seja, ninguém conseguirá chamar assim:
1 | var ajax = new Ajax(); |
Isso irá retornar um erro dizendo que undefined is not a function
, pois o método promises()
não é público :D
Agora só precisamos criar os outros testes de Promises para os outros métodos put
e delete
, para manter tudo documentado.
Como você pode perceber, o resultado dos nossos testes, além de garantir que tudo está funcionando, acabam servindo como documentação do nosso código. Não precisamos usar comentários dentro do módulo para dizer o que cada coisa faz, já que os testes já o fazem por nós :D
Quando alguém ler o resultado dos testes, ele saberá exatamente quais são os métodos disponíveis para uso!
Já temos os testes para toda a nossa interface pronta, mas a continuação ficará para o próximo artigo. Até lá!
Dúvidas até aqui? Comente :D
Sobre o #1postperday: https://blog.da2k.com.br/2014/12/31/um-post-por-dia/
Tem alguma sugestão para os próximos posts do #1postperday? Deixe ela aqui: https://github.com/fdaciuk/fdaciuk.github.io/issues/1