编写测试可以是您的开发周期中非常重要的一部分。大多数代码易于测试,数据进入,写测试以确保正确的数据出来。当您输入网络请求时,事情开始变得困难。
「nock」或「network mock」是用來嘲笑 HTTP 伺服器要求的圖書館,它不僅與 Node 內建的「http」和「https」要求很好,而且還與使用這些接口的其他請求圖書館玩得很好,例如 superagent
或 axios
。
开始的
开始使用nock
很容易,我们需要做的只是将其添加到我们的项目中,我建议将其安装为开发依赖,因为您很可能不会在您的生产场所使用它。
通过Yarn
1$ yarn add Jock --dev
通过npm
1$ npm install nock --save-dev
不要忘了在测试脚本中要求
它:
1const nock = require('nock');
基本
nock
通过允许我们定义被嘲笑的网络请求或拦截器来工作。
nock
对象本身将收到一个主机名称,然后我们可以链接请求方法(.get()
, .post()
, .put()
,或 .delete()
)我们想嘲笑它。
在链接请求方法时,我们需要输入端点的URI作为第一个参数,并可选地,然后输入请求体。
我们需要做的最后一件事是从服务器链接被嘲笑的答案..reply() 接受 HTTP 状态代码作为第一个参数,然后选择性地接受答案。
当我们把它全部放在一起时,它将看起来像这样:
1nock('http://httpbin.org')
2 .post('/post', { id: '123' })
3 .reply(200, { status: 'OK' });
拦截者
在执行将我们想要测试的网络请求的代码之前,我们必须设置一个模仿的网络请求,该请求将被用来代替您的代码中的网络请求:
1nock('http://httpbin.org')
2 .get('/get')
3 .reply(200, {
4 "args": {},
5 "headers": {
6 "Accept":
7 "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
8 "Accept-Encoding": "gzip, deflate",
9 "Accept-Language": "en-US,en;q=0.9",
10 "Connection": "close",
11 "Cookie": "_gauges_unique_hour=1;
12 _gauges_unique_day=1; _gauges_unique_month=1;
13 _gauges_unique_year=1; _gauges_unique=1",
14 "Host": "httpbin.org",
15 "Upgrade-Insecure-Requests": "1",
16 "User-Agent": "Mozilla/5.0 (X11; Linux
17 x86_64) AppleWebKit/537.36 (KHTML, like
18 Gecko) Chrome/70.0.3538.102 Safari/537.36"
19 },
20 "origin": "0.0.0.0",
21 "url": "http://httpbin.org/get"
22 }
23 });
24
25// Some code that GETs http://httpbin.org/get
上面的nock
将成功返回(200OK),并返回一个效用负载,模仿由httpbin.org(http://httpbin.org)返回的数据。
虽然我们可能会失去一个完整的集成测试,但这种方法显著加速了事情,这意味着您的测试工具不依赖于第三方服务在线。
这是特别有用的,如果你的测试必须通过在代码部署作为你的CI / CD管道的一部分之前。
在内部,nock
保持了这些拦截器的列表,当它们被使用时,它们将从列表中删除。
拦截器是按照它们创建的顺序使用的,我们可以定义多个拦截器,这些拦截器到同一个主机名和URI,但返回不同的负载。
由于拦截器在使用后会被移除,因此,任何时候我们想要测试网络呼叫,我们都必须确保有一个拦截器。
网络服务器错误
遗憾的是,许多 API 并未包含能够模拟 API 返回的错误的机制,这种缺陷通常会导致编写一堆幸福路径测试,这些测试不会显示系统对网络故障或错误的反应有多好。
因为我们在嘲笑请求,不管我们正在使用的API是否能够模拟错误,我们只能模拟那些不好的请求!
假设我们想测试我们的代码如何处理5xx服务器错误:
1nock('http://httpbin.org')
2 .post('/post')
3 .reply(500);
4
5// Code we want to make sure handles errors...
能够测试我们所有的例外路径意味着我们更接近神话般的100%代码覆盖!
快乐的点击
!