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