在前端开发中,测试是非常重要的一个环节,而测试异步代码则是相对复杂的一种。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:
Assert
风格的断言函数具有便利的将值转换为可读字符串的特性,具有更好的错误输出。如果对良好的断言的最终格式没有严格的要求,那么这种风格很适合。assert.equal(actual, expected); assert.typeOf(actual, type); assert.lengthOf(actual, expectedLength); assert.property(actual, propertyName)
Expect
风格是引入的,这种风格可以提供更易读的断言表达式。expect(actual).to.equal(expected); expect(actual).to.be.a(type); expect(actual).to.have.lengthOf(expectedLength); expect(actual).to.have.property(propertyName)
Should
风格是使用类似自然语言的链式接口,但需要使用插件支持。在入门等待期间,We recommend 使用 expect 风格。
功能差异:
Chai 语法
在测试异步代码时,我们将使用 Chai 库提供的以下语法:
- equal:用于检测两个变量的值是否相等。
- notEqual:用于检测两个变量的值是否不相等。
- ok:用于检测变量或表达式是否为真。
- notOk:用于检查变量或表达式是否为假。
- deepEqual:用于深度检查两个变量的值是否相等。
- notDeepEqual:用于检查两个变量的值是否不相等。
- isTrue:用于检查变量或表达式的值是否为 true。
- isFalse:用于检查变量或表达式的值是否为 false。
- throws:用于检查给定代码段是否抛出异常。 10.rejects:用于检查给定 promise 是否被拒绝。
Chai-as-promised 扩展
Chai-as-promised 是一个 Chai 扩展,它提供了一个 named expect 方法,该方法用于测试实现了 Promise API 的函数或方法。
安装命令:
$ npm i chai-as-promised -D
使用前导入:
const chai = require('chai'); const chaiAsPromised = require('chai-as-promised'); // Chai-as-promised 扩展初始化,插件代码必须在任何使用插件 API 部分之前加载: chai.use(chaiAsPromised);
该插件中有两个断言函数:
eventually
eventually 断言可以检查返回值是否符合异步预期值。
it('should check async calls', () => { return expect(callAsyncFunction()).to.eventually.equal('success'); });
rejected
在检查异步函数时检测其 reject。例如,以下示例期望 asyncRejectFunction 最终会被拒绝(也就是会抛出异常)
it('should check async calls', () => { return expect(callAsyncRejectFunction()).to.be.rejectedWith(Error); });
示例代码
下面的示例代码向我们展示了如何使用 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