前言
Chai 是一个 JavaScript 的断言库,能够支持 BDD/TDD 风格的断言库;同时也支持多种风格 API,包括 assert, expect 和 should。其中,assert 模块则提供了一组非常基础的断言方法,如 assert.equal(), assert.isTrue(), assert.isNotNull() 等等。本文将重点介绍 Chai 中 assert 模块的适用场景和使用规则。
assert 模块的适用场景
assert 模块适用于单元测试中的基础性测试。与其他模块相比,assert 模块的 API 简单、易懂,适用于快速编写测试用例,并对变量的值进行判断。当我们需要验证一个变量的值是否满足某个条件时,assert 模块则可以提供一个简单、清晰的方法,很容易理解其用法和结果。
assert 模块的使用规则
基础语法
assert 模块中提供了以下五个基本的断言方法:
- assert():判断一个表达式是否为真
- assert.deepEqual():判断两个值是否相等
- assert.deepStrictEqual():判断两个值是否严格相等
- assert.equal():判断两个值是否相等
- assert.strictEqual():判断两个值是否恒等
例如:
const assert = require('chai').assert; const foo = 'bar'; assert(foo === 'bar', 'foo should be a string equal to "bar"'); assert.deepEqual(foo, 'bar', 'foo and "bar" should have the same value');
在上面的代码中,我们使用了 assert() 和 assert.deepEqual() 方法。在第一个 assert() 语句中,我们判断了 foo 的值是否与字符串 "bar" 相等;如果不相等,就会抛出一个 AssertionError 异常,并且异常的信息为 'foo should be a string equal to "bar"'。在第二个 assert.deepEqual() 语句中,我们判断了 foo 的值与字符串 "bar" 是否拥有相同的值。
链式断言
除了基本的断言方法,assert 模块也提供了链式断言的方式。链式断言的本质是不断地对一个变量进行不同的检测,最终确定其是否符合预期。例如:
// javascriptcn.com 代码示例 const assert = require('chai').assert; const team = { name: 'Liverpool', players: [ { name: 'Alisson', position: 'goalkeeper' }, { name: 'Alexander-Arnold', position: 'right back' }, { name: 'Van Dijk', position: 'center back' } ] }; assert.typeOf(team, 'object') .has.property('name') .that.is.a('string') .with.length(9); assert.typeOf(team.players, 'array') .with.lengthOf(3) .but.does.not.include({ name: 'Salah', position: 'forward' });
在上面的代码中,我们对 team 的值进行了一系列断言。在第一个 assert 语句中,我们先调用 assert.typeOf() 断言方法,判断 team 是否为对象;接着,我们调用 has.property() 方法,判断 team 是否具有属性名为 name;然后,我们调用 is.a('string') 方法,判断 team.name 是否为字符串类型;最后,我们调用 with.length(9) 方法,判断 team.name 的长度是否为 9。
在第二个 assert 语句中,我们先判断 team.players 是否为数组类型,并且长度为 3;然后,我们调用 but.does.not.include() 方法,判断 team.players 中是否包含一个名为 Salah、位置为 forward 的球员。
异步断言
在异步场景下,assert 模块也提供了支持异步断言的方法。例如,在 Node.js 环境中,我们可以使用 callback 进行异步编程。在使用 assert 的异常语句时,我们需要将其放在回调函数中,这样才能保证在异步查询完成后再进行断言。例如:
const assert = require('chai').assert; const fs = require('fs'); // 异步读取文件 fs.readFile('./test.txt', function(err, data) { // 断言文件内容是否为 "Hello World" assert.strictEqual(data.toString(), 'Hello World'); });
在上面的代码中,我们使用了 Node.js 的 fs 模块来异步读取文件 ./test.txt。在回调函数中,我们使用 assert.strictEqual() 方法,断言文件内容是否为 "Hello World"。如果文件内容与预期的不符,assert 模块则会抛出一个 AssertionError 异常。
总结
通过本文的介绍,我们了解了 Chai 中 assert 模块的适用场景和使用规则。assert 模块提供了基本的断言方法、链式断言和支持异步断言等功能,能够适用于单元测试中的基础性测试。对于开发者而言,掌握 assert 模块的使用规则是提高代码质量和开发效率的重要一步。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f3a067d4982a6eb8c1acd