在前端开发中,测试是非常重要的一环。而在 JavaScript 中,测试框架是必不可少的,而 Chai 是其中一款非常流行的测试框架。在 Chai 中,assert 和 expect 是两个最常使用的测试工具,本文将对它们的差异、优缺点进行分析。
assert
assert 是在 Node.js 中提供的一个基础的测试工具,而在 Chai 中也有相应的实现。它主要通过一些预定义的方法来断言一个值是否符合期望,例如:
assert.equal(1 + 1, 2); // 通过 assert.equal(1 + 1, 3); // 失败,会抛出错误
assert 的语法十分简洁明了,一行代码就可以完成大部分的测试需求,因此被广泛使用。但是,assert 也有一些明显的缺点:
错误信息不友好
当使用 assert 的某个方法进行断言时,如果断言失败,它只会抛出一个错误,而这个错误信息通常只包含一些堆栈信息和一些位置指示符,对用户来说没有多少帮助。使用者需要进一步去调查错误信息,排除错误原因。
仅支持一种断言形式
assert 只支持类似 equal
这样的形式的断言方式,因此它不支持像 expect 中的 "to.be." 形式的连贯断言,这些连贯形式的语句对于更好地组织测试用例和代码有很大的帮助。
不易扩展
assert 本身是一个非常基础的工具,且具有一定的局限性。当我们需要实现更加复杂的断言时,它的扩展性就显得比较有限了。
expect
expect 是另一种在 Chai 中提供的测试工具,它采用了更加自然、符合口语的语法,而且具有非常好的扩展性。它的语法十分直观,例如:
expect(1 + 1).to.equal(2); // 通过 expect(1 + 1).to.equal(3); // 失败,会抛出错误
expect 不仅支持基础的 equal 断言,还支持一系列的连贯形式的断言,例如:
expect([1, 2, 3]).to.have.lengthOf(3); expect('hello').to.be.a('string').and.include('o');
这些连贯形式的语句对于更好地组织测试用例和代码有很大的帮助。
链式断言
使用 expect 可以进行链式断言,例如:
// javascriptcn.com 代码示例 const obj = { name: 'david', age: 20, hobby: ['reading', 'music'], }; expect(obj) .to.be.an('object') .that.has.property('name', 'david') .with.property('hobby') .that.includes('reading');
这种链式断言具有非常好的可读性和可组织性,可以将测试用例更加清晰地组织起来。
扩展性
相较于 assert,expect 具有非常好的扩展性。我们可以通过编写自定义的 matcher 来实现更加复杂的断言,例如:
// javascriptcn.com 代码示例 chai.use(function (_chai, utils) { _chai.Assertion.addMethod('person', function (name, age) { const obj = this._obj; const keys = Object.keys(obj); this.assert(keys.includes('name') && keys.includes('age'), 'expected #{this} to have name and age'); this.assert(obj.name === name, 'expected #{this} to have name #{exp} but got #{act}', name, obj.name); this.assert(obj.age === age, 'expected #{this} to have age #{exp} but got #{act}', age, obj.age); }); }); const p = { name: 'david', age: 20, }; expect(p).to.be.person('david', 20); // 通过 expect(p).to.be.person('david', 22); // 失败,会抛出错误
通过编写自定义的 matcher,我们就可以实现一些类似于链式语法的自定义匹配器,可以更加方便地组织测试用例和代码。
总结
使用 expect 和 assert 都可以对值进行断言,但它们在语法和扩展性上有很大的不同。如果你想要一个简单但功能齐全的测试工具,assert 可能是一个不错的选择;但如果你想要一个更加灵活和扩展性更好的测试工具,你应该选择 expect。
在使用过程中,我们应该根据实际情况来选择正确的测试工具,以保证测试用例的可维护性和代码的可读性。同时,也应该注意在写测试用例时养成良好的习惯,例如合理地组织测试用例、编写可读性高的测试用例等等。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65321bd77d4982a6eb453cba