O teste de unidade de APIs externas é difícil, não importa em que linguagem o senhor o faça. Trabalhar com qualquer API externa é assustador, mesmo porque o controle sobre problemas de rede, alterações de API e uma série de outros problemas é nulo. Mas se o senhor criar um serviço que dependa dos dados de outro host, ainda assim é importante criar testes de unidade que dependam do outro serviço.
Se estiver usando um serviço de terceiros, criar testes unitários é realmente difícil… até que o senhor descubra nock, um módulo de nó que intercepta solicitações e permite que o senhor responda a elas como desejar, inclusive enviando de volta códigos de resposta e cargas úteis personalizados. Deixe-me mostrar ao senhor como usar o nock!
Obtendo o nock
Como todo pacote node, o senhor precisa instalá-lo primeiro:
npm install nock
Depois de instalado, exija-o em seu script:
var nock = require('nock');
Essa é a configuração.
Usando o nock
O uso mais básico do nock é interceptar uma solicitação GET para um determinado URL:
nock('https://davidwalsh.name') .get('/users/22').reply(200, { username: 'davidwalshblog', firstname: 'David' }); nock('https://davidwalsh.name') .get('/content/homepage') .reply(200, 'This is the HTML for the homepage'); nock('https://davidwalsh.name') .get('/content/page-no-exist') .reply(404, 'This page could not be found');
O exemplo acima intercepta uma solicitação GET para um determinado host + caminho e responde com um código de resposta e conteúdo desejados. O senhor também pode interceptar solicitações POST:
nock('https://davidwalsh.name') .post('/users/detail') .reply(200, { firstname: 'David' });
O senhor também pode restringir as correspondências GET e POST definindo os dados ou as strings de consulta:
nock('https://davidwalsh.name') .post('/users/detail', { username: 'davidwalshblog' }) .reply(200, { firstname: 'David' });
Se a resposta com determinados cabeçalhos for importante, o senhor também pode fazer isso:
var scope = nock('https://davidwalsh.name') .get('/') .reply(200, 'Hello World!', { 'X-My-Headers': 'My Header value' });
Se quiser fazer alguma lógica de processamento avançada antes de responder à solicitação, o senhor pode responder com uma função:
nock('https://davidwalsh.name') .post('/users/detail', { username: 'davidwalshblog' }) .reply(function() { // Some logic return [200, resultingContent]; });
Então, por que tudo isso é importante? Se você fizer qualquer teste baseado em serviço no Node.js, incluindo qualquer coisa, desde HTTP até testes locais de banco de dados/serviço, precisará desesperadamente de um utilitário que possa interceptar real em vez de tentar manipular métodos de solicitação de patches ou usar outras soluções alternativas grosseiras. Resumindo: seu aplicativo pode funcionar normalmente durante o teste, o nock intercepta essas solicitações e retorna o que o senhor deseja!
E o que há de incrível nock? Esta postagem aborda os conceitos básicos do nock. Para um projeto em que estou trabalhando chamado Discord, criei um conjunto de testes que é executado a partir dos testes registrado por…nock. Criei um registro que salvava as solicitações e suas respostas, poupando-nos muito trabalho manual.
Conheça o nock! E agradeça-me no Twitter quando o senhor tiver terminado!