使用 Nock 测试 Node.js 中的 HTTP 请求

编写测试可以是您的开发周期中非常重要的一部分。大多数代码易于测试,数据进入,写测试以确保正确的数据出来。当您输入网络请求时,事情开始变得困难。

「nock」或「network mock」是用來嘲笑 HTTP 伺服器要求的圖書館,它不僅與 Node 內建的「http」和「https」要求很好,而且還與使用這些接口的其他請求圖書館玩得很好,例如 superagentaxios

开始的

开始使用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%代码覆盖!

快乐的点击!

Published At
Categories with 技术
Tagged with
comments powered by Disqus