区分 Sinon 和 Chai-CPS 的 spy

阅读时长 5 分钟读完

区分 Sinon 和 Chai-CPS 的 spy

在编写单元测试时,我们经常需要模拟函数和对象的行为。这时候我们会用到 spy 来监视函数或对象的调用情况。常见的 spy 库有 Sinon 和 Chai-CPS。虽然它们都可以实现 spy 的功能,但是在使用过程中需要注意它们之间的区别。

Sinon

Sinon 是一个流行的 JavaScript 测试框架,可用于模拟 HTTP 请求、计时器等等。其中最常用的功能是 mock、stub 和 spy。在 Sinon 中,我们可以使用 spy 监视任何 JavaScript 函数的调用情况,包括对象方法。

创建 spy

通过 Sinon 可以很方便地创建 spy。

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

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

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

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

如何使用

Sinon 的 spy 可以用于断言某个函数是否被调用,以及函数的参数和返回值。spy 有许多监听函数调用的属性和方法,可以用于编写严谨的单元测试。

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

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

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

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

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

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

Chai-CPS

Chai-CPS 是 Chai 的插件,CPS 代表 Continuation-passing style(继续传递风格)。Chai-CPS 提供了一种更加自然的方式来测试异步代码中的函数的行为。 Chai-CPS 的 spy 不同于 Sinon 的 spy,不能直接用于断言函数被调用。

创建 spy

Chai-CPS 的 spy 是通过 wrap 函数来创建的。

如何使用

Chai-CPS 的 spy 不能直接用于断言函数被调用,而是要用在异步代码中。我们可以通过 wrap 函数来转化异步函数为 CPS 风格的函数,并在其中使用 spy 监视函数的调用情况。

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

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

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

在使用 Chai-CPS 的 spy 时,我们要注意它的使用场景和语法。

总结

Sinon 和 Chai-CPS 都是 JavaScript 中常用的 spy 库。两者的使用场景和语法有所不同。在编写单元测试时,我们要根据需求选择相应的库。在使用时,我们需要注意它们的区别。

示例代码

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

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

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

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

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

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

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

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

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

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

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

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

纠错
反馈