Zachyťte požadavky HTTP pomocí Node.js nock

Testování jednotek externích rozhraní API je obtížné bez ohledu na to, v jakém jazyce to děláte.  Sakra, práce s jakýmkoli externím rozhraním API je děsivá, už jen proto, že nemáte žádnou kontrolu nad problémy se sítí, změnami rozhraní API a řadou dalších problémů. Pokud ale vytvoříte službu, která se spoléhá na data jiného hostitele, je stále důležité vytvořit testy jednotek, které se spoléhají na druhou službu.

Pokud používáte službu třetí strany, je vytváření testů jednotek opravdu těžké...dokud neobjevíte nock, modul uzlů, který zachycuje požadavky a umožňuje vám na ně reagovat, jak chcete, včetně zasílání vlastních kódů odpovědí a datových částí. Dovolte mi, abych vám ukázal, jak používat nock!

Dostávám nock

Jako každý balíček uzlů jej musíte nejprve nainstalovat:

npm install nock

Po instalaci je vyžadováno ve vašem skriptu:

var nock = require('nock');

To je nastavení.

Použití nock

Nejzákladnějším použitím nock je zachycení požadavku GET na danou adresu 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');

Výše uvedený příklad zachytí požadavek GET na daného hostitele + cestu a odpoví požadovaným kódem odpovědi a obsahem. Můžete také zachytit požadavky POST:

nock('https://davidwalsh.name')
	.post('/users/detail')
	.reply(200, {
		firstname: 'David'
	});

Shody GET a POST můžete také zúžit nastavením dat nebo řetězců dotazu:

nock('https://davidwalsh.name')
	.post('/users/detail', { username: 'davidwalshblog' })
	.reply(200, {
		firstname: 'David'
	});

Pokud je důležité odpovídat s danými záhlavími, můžete to udělat také:

var scope = nock('https://davidwalsh.name')
	.get('/')
	.reply(200, 'Hello World!', {
		'X-My-Headers': 'My Header value'
	});

Pokud chcete před odpovědí na požadavek provést nějakou pokročilou logiku zpracování, můžete místo toho odpovědět funkcí:

nock('https://davidwalsh.name')
	.post('/users/detail', { username: 'davidwalshblog' })
	.reply(function() {

		// Some logic

		return [200, resultingContent];
	});

Proč je to všechno důležité? Pokud v rámci Node.js provádíte jakékoli testování založené na službách, včetně čehokoli od HTTP po testování místní databáze/služeb, budete zoufale hledat nástroj, který dokáže zachytit skutečné požadavky namísto pokusu opičit metody požadavků na opravu nebo použít jiná hrubá řešení. Stručně řečeno:vaše aplikace může během testování fungovat jako obvykle, nock tyto požadavky zachytí a vrátí zpět, co chcete!

A co je na nocku úžasného? Tento příspěvek se dotýká samotných základů nock. Pro projekt, na kterém pracuji s názvem Discord, jsem vytvořil testovací sadu, která běží na testech zaznamenaných od...nock. Vytvořil jsem záznam, který ukládal požadavky a jejich odpovědi, což nám ušetřilo spoustu ruční práce.

Seznamte se s nockem! A až budete hotovi, poděkujte mi na Twitteru!