在 Mocha 测试框架中使用 sinon-chai 扩展 chaijs

阅读时长 9 分钟读完

前言

在前端开发中,测试是非常重要的一环。提高测试的覆盖率和质量,可以保证代码的健壮性和稳定性。

Mocha 和 Chai 是两个非常流行的前端测试框架,Mocha 负责测试运行,而 Chai 则是一个断言库,它允许我们使用自然语言来编写测试用例。

Sinon 是一个用于 JavaScript 测试的独立库,它提供了针对 JavaScript 测试重要方面的一些工具,如:fake timers, spies, stubs 等。

在本文中,我们将探讨如何使用 sinon-chai 扩展 Chai,来增强我们的测试用例。

安装和配置

安装 sinon-chai 可以使用 npm 安装,执行如下命令:

然后在 test 目录下,创建一个名为 setup.js 的文件,做出如下配置:

在 Mocha 的配置文件中,增加如下代码:

Sinon-Chai 的 API 及使用方法

Sinon-Chai 主要提供了一些增强 chai.js 的 API,它们可以方便的与 sinon.js 的 fake functions(spies, stubs)进行配合使用。

在 chai 中使用 spy

sinon-chai 可以让你在你的测试断言时更加方便的使用 spy,当你想要一个方法的调用次数时,可以使用 called 属性,它返回一个 truefalse,代表这个方法是否被调用过。如果这个函数被调用了至少一次,我们还可以使用 callCount 属性来检查它调用的次数。

在 chai 中使用 stub

sinon-chai 也增强了 fn 断言,可以让你轻松地检查一个方法是否被正确替换成 stub

在 chai 中使用 mock

sinon-chai 提供的 mock 方法可以让我们更深入的测试场景。使用 mock 方法可以断言一个方法的调用次数,并且可以检查一个对象上的多个方法。

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

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

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

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

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

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

在 chai 中使用 fake timers

sinon-chai 可以与 sinon.js 配合,方便的使用 fake timers。使用 fake timers 可以在测试中特定的时刻或时间间隔前进或后退。

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

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

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

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

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

示例代码

下面是一个使用 Mocha 和 Chai 进行测试的示例代码,使用了 sinon-cha 检查模拟请求函数是否被调用。这个示例中,app.js 定义了三个方法用于模拟 http 请求和 app 的初始化工作。

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

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

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

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

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

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

下面是针对 app.js 的单元测试,其中我们使用 sinon.js 中的 stub,模拟 http 请求,来检查模拟请求函数是否被正确调用:

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

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

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

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

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

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

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

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

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

在这个示例中,我们使用了 sinon.stub() 方法,从而针对 http 进行了模拟请求,而检查模拟请求函数是否被正确调用,则用了 sinon-chai 断言库,使用 expect(stub).to.have.been.called.once; 语法,来检查模拟请求函数是否被调用过一次。

结论

sinon-chai 扩展了 Chai 断言库,通过增强 chai.js 的 API,可以方便的与 sinon.js 的 fake functions(spies, stubs)进行配合使用。使用 sinon-chai,你可以更加方便的编写测试用例,从而大大提高了测试的覆盖率和质量。

希望本文内容能帮助到读者,也欢迎在评论区留言,分享自己的测试经验和思考。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6747e13c5883fc5ebfe76bde

纠错
反馈