在 Mocha 中使用 Nock 劫持和模拟 API 请求

阅读时长 8 分钟读完

在前端开发中,我们经常需要测试代码与服务器端的交互。而在测试过程中,有些情况我们希望取消对真实的 API 的调用,或者是希望在本地进行测试,而不是通过互联网连接真实的 API。而这时候,Nock 就是一个非常好的解决方案。

什么是 Nock

Nock 是一个用于测试 http 请求的库。Nock 可以劫持和模拟http请求,从而使我们可以在本地运行测试而不需要连接到真正的 api。

当我们需要针对某一特定 API 进行测试时,Nock 可以mock请求,拦截请求,并直接返回模拟出来的响应。Nock 给予我们模拟特定数据源的能力,也让我们得以对于特定的边沿情况进行测试。

Nock 的优点

  • 能很方便的模拟 http 请求,而无需耗费系统资源去创建基于真实请求的测试环境。
  • 通过模拟不同的 http 请求,多种响应,Nock 可以让程序员很轻易的完成测试用例。
  • 支持链式断言,也就是让测试用例看起来更加的清晰,而且可以通过一个测试用例来覆盖多种情况。
  • 不会对项目代码造成任何损伤。请求路由,响应处理和真正的 api 完全互不干扰,互不影响。
  • 方便的 API 模拟静态文件、动态请求。

Nock 也有适用的场景:在实际运行环境中,我们希望调用真正的 API 进行交互。

安装 Nock

使用 npm 进行安装。

npm i -s nock

测试用例

接下来,让我们来写一个测试用例来说明使用 Nock 劫持和模拟 API 请求的过程。

源代码如下:

-- -------------------- ---- -------
----- ------ - -----------------------
----- ------- - -------------------
----- ---- - ----------------

---------------- -- -- -
  -------- - -- ----- -------- ------ -
    
    ----- -------- - -
      ------- -----
      ----- -
        ----- -----
        ---- --
      -
    -

    -----------------------
      -------------------
      ----------- ---------

    ----------------------------------------- ------- --------- ----- -- -
      ---------------------------
      ------------------------------------------------
      -------
    --
  --
--

我们用 Nock 来模拟请求,在 callback 中比较 response,大功以竣。运行测试用例,我们可以看到以下输出。

如您所见,我们获得成功的响应,证明模拟请求就像真实的请求一样。

如何使用 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

纠错
反馈