如何使用 Chai 来测试异步代码?

在前端开发中,测试是非常重要的一个环节,而测试异步代码则是相对复杂的一种。Chai 是一个常用的 JavaScript 测试库,它不仅可以用于测试同步代码,还可以用于测试异步代码。

在本文中,我们将介绍如何使用 Chai 来测试异步代码,并提供详细的学习和指导意义,同时也会包含一些示例代码。

异步代码测试方法

异步代码测试有两种方法:回调函数和 Promise。

回调函数

回调函数是 JavaScript 异步编程中最常用的方式之一。在测试异步代码时,我们将使用 Mocha 的 done() 函数来测试回调函数。done() 函数是一个回调函数,当测试用例中的异步代码执行完毕时,会立即执行该函数。

由于 JS 是单线程的,异步函数的结果并不能在主线程中马上获取到,而用 done() 函数来告诉测试框架,测试结束了,可以检验了。毕竟测试异步代码不像同步代码,同步代码你在它完成后,直接通过访问变量和返回值来继续执行下一步,而异步代码得通过回调函数和 promise 这样的方式来拿到异步返回值。

Promise

Promise 是 ECMAScript 2015(ES6) 中新增的异步处理机制。在测试异步代码时,我们将使用 Chai-as-promised 和 async/await 语法来测试 Promise。

Chai-as-promised 是一个 Chai 扩展,它提供了一个 named expect 方法,该方法用于测试实现了 Promise API 的函数或方法,使异常的测试更容易。async/await 语法是基于 Promise 实现,它可以使异步代码的测试更加简洁。

Chai 测试库

Chai 是一个流行的行为驱动开发(BDD)风格的测试库。与其他测试框架不同,Chai 不像断言库那样只提供一些表达式,并避免了构建出鲁棒的测试套件的方式。相反,Chai 具有很强的表达力,并基于宾语可读性和可维护性来构建所有测试。

Chai 具有三种主要风格:Should、Expect 和 Assert:

  1. Assert 风格的断言函数具有便利的将值转换为可读字符串的特性,具有更好的错误输出。如果对良好的断言的最终格式没有严格的要求,那么这种风格很适合。

    -------------------- ----------
    --------------------- ------
    ----------------------- ----------------
    ----------------------- -------------
  2. Expect 风格是引入的,这种风格可以提供更易读的断言表达式。

    ----------------------------------
    -----------------------------
    ------------------------------------------------
    ---------------------------------------------
  3. Should 风格是使用类似自然语言的链式接口,但需要使用插件支持。在入门等待期间,We recommend 使用 expect 风格。

功能差异:

Chai 语法

在测试异步代码时,我们将使用 Chai 库提供的以下语法:

  1. equal:用于检测两个变量的值是否相等。
  2. notEqual:用于检测两个变量的值是否不相等。
  3. ok:用于检测变量或表达式是否为真。
  4. notOk:用于检查变量或表达式是否为假。
  5. deepEqual:用于深度检查两个变量的值是否相等。
  6. notDeepEqual:用于检查两个变量的值是否不相等。
  7. isTrue:用于检查变量或表达式的值是否为 true。
  8. isFalse:用于检查变量或表达式的值是否为 false。
  9. throws:用于检查给定代码段是否抛出异常。 10.rejects:用于检查给定 promise 是否被拒绝。

Chai-as-promised 扩展

Chai-as-promised 是一个 Chai 扩展,它提供了一个 named expect 方法,该方法用于测试实现了 Promise API 的函数或方法。

安装命令:

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

使用前导入:

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

该插件中有两个断言函数:

eventually

eventually 断言可以检查返回值是否符合异步预期值。

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

rejected

在检查异步函数时检测其 reject。例如,以下示例期望 asyncRejectFunction 最终会被拒绝(也就是会抛出异常)

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

示例代码

下面的示例代码向我们展示了如何使用 Chai 来测试回调和 Promise 函数。

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

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

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

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

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

在上面的代码中,fetchData 函数是一个回调函数,我们使用 Mocha 的 done() 函数进行测试。fetchPromiseData 函数返回一个 Promise,我们使用 async/await 和 Chai-as-promised 进行测试。

结论

通过阅读本文,我们了解了如何使用 Chai 来测试异步代码。我们详细介绍了异步代码测试方法、Chai 测试库以及 Chai 语法和 Chai-as-promised 扩展的使用。希望这篇文章对你有帮助,同时你也能在实际应用中使用 Chai 来测试你的异步代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671a1e3b9babaf620fa15ac6