Chai-As-Promised:为嵌套式异步代码编写更友好的测试

阅读时长 5 分钟读完

Chai-As-Promised:为嵌套式异步代码编写更友好的测试

在前端开发中,异步代码是不可避免的。例如,读取远程数据,响应用户交互,定时器回调等等。这些代码难以测试是因为它们需要一定的时间才能完成。通常会出现两个问题:第一,测试结果不能准确反映异步代码的状态,而是随机失败;第二,测试代码本身很难看,由于异步代码嵌套等原因,出现了多层回调,使得代码费力读取。

下面,我们来介绍 Chai-As-Promised,它是一个测试框架,能够让您为异步代码编写简洁、优雅的测试用例。Chai-As-Promised 还提供了许多方法,可以帮助您更好地测试异步代码。

  1. 安装 Chai-As-Promised

首先,您需要在项目中安装 Chai-As-Promised。Chai-As-Promised 是 Chai 的扩展,它提供了额外的一些 matcher、assertion 和 fluent API ,可以为异步代码编写测试。打开终端,运行以下命令来安装:

  1. 使用 Chai-As-Promised

安装成功后,您可以在测试文件中导入 Chai 和 Chai-As-Promised。例如:

Chai-As-Promised 是一个桥接库,为 Chai 添加了 Promise 的支持。要使用 Chai-As-Promised,请在添加 Promise 链到期望中时使用它的 API。

  1. Promise 萃取

Chai 的语法检查器精确地在提取它可以处理的常规 JavaScript 值的同时,它也可以处理 Promise。类似于 assert 式断言,Chai-As-Promised 提供了 expect 式 Assertions。

Expect 式断言提供了更加声明性的语法,易于阅读和理解。

下面是一个简单的例子,其中我们使用 Chai-As-Promised 来测试一个异步函数的返回结果:

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

--------------- -- -- -
    ----------- - --------- ------- ---- ------- -- -- -
        ------ -----------------------------------------
    ---
---
展开代码

这个测试用例的功能是测试函数 foo() 的返回结果是否为 'bar'。由于 foo() 是一个异步函数,我们需要在测试之前明确地等待它完成。使用 Chai-As-Promised,我们可以非常容易地使用 expect() 和 eventually(),来测试 Promise 的执行结果。

我们使用 expect() 来确保 Promise 被很好地解决,并且 eventually() 来调用等待 Promise 对象成功后期望的断言。在这种方式下,我们可以得到更具可读性的测试代码。

  1. 自定义 Promise

在一些特定的情况下,您可能需要使用自己的 Promise 函数来测试。Chai-As-Promised 提供了一个 promised 方法,它作为一个工厂函数来生成一个携带 Promise 链的 expect 对象。

下面是一个简单的例子,它演示了如何使用 promised API 来测试您自己的 Promise 方法:

这个测试用例的功能是使用 chai-as-promised 的 promised API 来测试返回的字符串是否与我们期望的字符串相等。

  1. assertion

当使用 assert 式断言时,在执行测试时有很多可用的指令,来决定期望的值是否与实际值一致。类似的,当使用 expect 式断言时,您可以指定一个或多个 assertion 属性,来做同样的事情。

下面是常见的 assertion 属性列表:

  • to.be.rejectedWith
  • to.be.fulfilled
  • to.be.fulfilledWith
  • to.be.rejected
  • to.be.rejectedWith
  • to.be.notify
  • to.be.notifyWith
  • and.notify
  • and.notifyWith

其中 rejectedWith()fulfilledWith() 是当 Promise 得到解决后使用的最常见的行为之一。如果返回的值与期望的值不匹配,它将抛出一个明确的错误:

  1. 总结

Chai-As-Promised 提供了许多工具,使得您能够更好地测试异步代码。它增加了许多对 Promise 的支持,使得测试异步代码变得更加容易,并且能更加自然地表达测试意图。在维护一个拥有异步代码的项目时,Chai-As-Promised 是一个非常棒的工具,它可以让测试成为一个平滑的过程。

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

纠错
反馈

纠错反馈