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!