Chai-As-Promised:为嵌套式异步代码编写更友好的测试
在前端开发中,异步代码是不可避免的。例如,读取远程数据,响应用户交互,定时器回调等等。这些代码难以测试是因为它们需要一定的时间才能完成。通常会出现两个问题:第一,测试结果不能准确反映异步代码的状态,而是随机失败;第二,测试代码本身很难看,由于异步代码嵌套等原因,出现了多层回调,使得代码费力读取。
下面,我们来介绍 Chai-As-Promised,它是一个测试框架,能够让您为异步代码编写简洁、优雅的测试用例。Chai-As-Promised 还提供了许多方法,可以帮助您更好地测试异步代码。
- 安装 Chai-As-Promised
首先,您需要在项目中安装 Chai-As-Promised。Chai-As-Promised 是 Chai 的扩展,它提供了额外的一些 matcher、assertion 和 fluent API ,可以为异步代码编写测试。打开终端,运行以下命令来安装:
npm install chai-as-promised --save-dev
- 使用 Chai-As-Promised
安装成功后,您可以在测试文件中导入 Chai 和 Chai-As-Promised。例如:
const chai = require('chai'); const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); const expect = chai.expect;
Chai-As-Promised 是一个桥接库,为 Chai 添加了 Promise 的支持。要使用 Chai-As-Promised,请在添加 Promise 链到期望中时使用它的 API。
- 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 对象成功后期望的断言。在这种方式下,我们可以得到更具可读性的测试代码。
- 自定义 Promise
在一些特定的情况下,您可能需要使用自己的 Promise 函数来测试。Chai-As-Promised 提供了一个 promised
方法,它作为一个工厂函数来生成一个携带 Promise 链的 expect 对象。
下面是一个简单的例子,它演示了如何使用 promised
API 来测试您自己的 Promise 方法:
describe('myPromiseFunction', () => { it('should test using promised', () => { return expect(chaiAsPromised.myPromiseFunction()).to.eventually.equal('resolved'); }); });
这个测试用例的功能是使用 chai-as-promised
的 promised API 来测试返回的字符串是否与我们期望的字符串相等。
- 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 得到解决后使用的最常见的行为之一。如果返回的值与期望的值不匹配,它将抛出一个明确的错误:
describe('myPromiseFunction', () => { it('should rejected with `Error`', () => { return expect(chaiAsPromised.myPromiseFunction()).to.be.rejectedWith(Error); }); });
- 总结
Chai-As-Promised 提供了许多工具,使得您能够更好地测试异步代码。它增加了许多对 Promise 的支持,使得测试异步代码变得更加容易,并且能更加自然地表达测试意图。在维护一个拥有异步代码的项目时,Chai-As-Promised 是一个非常棒的工具,它可以让测试成为一个平滑的过程。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649aef3648841e98947db3b0