在前端开发中,我们经常需要测试代码与服务器端的交互。而在测试过程中,有些情况我们希望取消对真实的 API 的调用,或者是希望在本地进行测试,而不是通过互联网连接真实的 API。而这时候,Nock 就是一个非常好的解决方案。
什么是 Nock
Nock 是一个用于测试 http 请求的库。Nock 可以劫持和模拟http请求,从而使我们可以在本地运行测试而不需要连接到真正的 api。
当我们需要针对某一特定 API 进行测试时,Nock 可以mock请求,拦截请求,并直接返回模拟出来的响应。Nock 给予我们模拟特定数据源的能力,也让我们得以对于特定的边沿情况进行测试。
Nock 的优点
- 能很方便的模拟 http 请求,而无需耗费系统资源去创建基于真实请求的测试环境。
- 通过模拟不同的 http 请求,多种响应,Nock 可以让程序员很轻易的完成测试用例。
- 支持链式断言,也就是让测试用例看起来更加的清晰,而且可以通过一个测试用例来覆盖多种情况。
- 不会对项目代码造成任何损伤。请求路由,响应处理和真正的 api 完全互不干扰,互不影响。
- 方便的 API 模拟静态文件、动态请求。
Nock 也有适用的场景:在实际运行环境中,我们希望调用真正的 API 进行交互。
安装 Nock
使用 npm 进行安装。
$ npm install nock --save-dev
npm i -s nock
测试用例
接下来,让我们来写一个测试用例来说明使用 Nock 劫持和模拟 API 请求的过程。
源代码如下:
-- -------------------- ---- ------- ----- ------ - ----------------------- ----- ------- - ------------------- ----- ---- - ---------------- ---------------- -- -- - -------- - -- ----- -------- ------ - ----- -------- - - ------- ----- ----- - ----- ----- ---- -- - - ----------------------- ------------------- ----------- --------- ----------------------------------------- ------- --------- ----- -- - --------------------------- ------------------------------------------------ ------- -- -- --
我们用 Nock 来模拟请求,在 callback 中比较 response,大功以竣。运行测试用例,我们可以看到以下输出。
{"status":"成功","data":{"user":"小明","age":20}}
如您所见,我们获得成功的响应,证明模拟请求就像真实的请求一样。
如何使用 Nock
前面我们通过一个测试用例的实现说明了使用 Nock,现在,让我们来详细阐述一下如何使用 Nock。
模拟一个 GET 请求
Nock 提供了 nonck(url, response) 方法实现 GET 请求。
-- -------------------- ---- ------- --- ---- - ---------------- -- ---- ----------------------- ------------ ----------- ------ --------- -- ---- ------------------------------ -------- ------- --------- ----- - ------------------ -- -- ------ ----- ------ -
模拟一个 POST 请求
-- -------------------- ---- ------- --- ---- - ---------------- -- ---- ----------------------- ------------------- ----------- ------ ------------ --- --------- - --------------------- ----- ---- ----- --------- ---- --------------------------- ------- ------- -------- - --------------- ------------------- ----------------- ---------------------------- -- ----- --------- -- -------- ------- --------- ----- - ------------------ - -- -- ------ ----- --------- -
多个响应
-- -------------------- ---- ------- --- ---- - ---------------- --- ------- - ------------------- ----------------------- ------------------- ----------- - ------ ---------- ----- - -------- --- - -- ---------------------- ----------- - ------- --------- -- ---------------------- ------------ --- --------- - --------------------- ----- ---- ----- --------- ---- --------------------------- ------- ------- -------- - --------------- ------------------- ----------------- ---------------------------- -- ----- --------- -- -------- ------- --------- ----- - ------------------ --- ------------
模拟错误响应
-- -------------------- ---- ------- --- ---- - ---------------- --- ------- - ------------------- ----------------------- ------------------- ----------------------- -------- ---------------------------------------- -------- ------- --------- ----- - ------------------- --- -- ----------- -----
模拟网络延迟
-- -------------------- ---- ------- --- ---- - ---------------- --- ------- - ------------------- ----------------------- ------------ ------------ ----------- ------ -------------------- ------------------------------ -------- ------- --------- ----- - ------------------ -- -- --------------------
重复多次
-- -------------------- ---- ------- --- ---- - ---------------- --- ------- - ------------------- ----------------------- ------------ --------- ----------- ------ ---------- ------------------------------ -------- ------- --------- ----- - ------------------ -- ------------------------------ -------- ------- --------- ----- - ------------------ -- ------------------------------ -------- ------- --------- ----- - ------------------ -- -- ----- -- - ----- ------- - -- - ----- ------- - -- - ----- ------- -
这里的 times(num)方法用来指定 API 应该被调用的次数。
总结
Nock 为我们提供了一个拦截和劫持http请求以及自定义 API 响应的强有力的工具。他可以帮助我们在前端开发中更准确的、更有效的测试代码与服务器端的交互。
在使用 Nock 的过程中,可以随意指定多个复杂的响应状态来检测 API 的行为是否符合预期。Nock 的 API 明确而简单,便于我们快速学习。希望此篇文章对您的学习和工作有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646d6e7a968c7c53b0c1c5aa