在前端开发中,测试是非常重要的,而 Chai.js 是一个开源的断言库,可以帮助我们更好的进行测试。Chai.js 提供了两种方式去断言:expect 和 assert,下面来介绍一下在 Chai.js 中如何使用这两种方式和最佳实践。
expect
expect 的使用方式相对简单,便于可读性和可维护性:
expect(foo).to.be.a('string'); expect(foo).to.equal('bar'); expect(foo).to.have.lengthOf(3); expect(beverages).to.have.property('tea').with.length(3);
常用的 expect 断言
类型判断
expect(foo).to.be.a('string')
:判断 foo 是字符串类型expect(foo).to.be.an.instanceof(Foo)
:判断 foo 是 Foo 类的实例
值判断
expect(foo).to.equal('bar')
:判断 foo 的值等于 barexpect(foo).to.be.empty
:判断 foo 为空expect(foo).to.include('bar')
:判断 foo 包含 barexpect(foo).to.have.lengthOf(3)
:判断 foo 的长度是 3expect(foo).to.match(/^bar$/)
: 断言 foo 通过正则 /^bar$/ 的匹配
对象和属性判断
expect(foo).to.be.a('object')
:判断 foo 是对象类型expect(foo).to.have.property('bar')
:判断 foo 包含属性 barexpect(foo).to.have.property('bar', 'baz')
:判断 foo 的属性 bar 的值为 bazexpect(foo).to.be.deep.equal({a: 'foo', b: 'bar'})
: 判断 foo 深等于 {a: 'foo', b: 'bar'}
expect 最佳实践
- 使用
to.be.a()
或to.be.an.instanceof()
来判断变量类型 - 尽可能地使用链式调用
- 使用
to.be.ok
来判断变量是否存在或是否为 true - 使用
to.exist
来判断变量是否存在 - 使用
to.be.empty
来判断变量是否为空数组或对象 - 使用
to.include
或to.not.include
来判断数组或字符串是否包含某一项 - 对于对象类型,使用
to.have.property
来判断属性是否存在和属性的值 - 对于数组类型,使用
to.have.lengthOf
来判断长度
assert
assert 模块的使用方式更为简单,如下所示:
assert.typeOf(foo, 'string'); assert.equal(foo, 'bar'); assert.lengthOf(foo, 3); assert.property(beverages, 'tea');
常用的 assert 断言
类型判断
assert.typeOf(foo, 'string')
:判断 foo 是字符串类型assert.instanceOf(foo, Foo)
:判断 foo 是 Foo 类的实例
值判断
assert.equal(foo, 'bar')
:判断 foo 的值等于 barassert.isEmpty([])
:判断一个空数组assert.isNotEmpty([1])
:判断一个非空数组assert.include(foo, 'bar')
:判断 foo 包含 barassert.lengthOf(foo, 3)
:判断 foo 的长度是 3
对象和属性判断
assert.isObject(foo)
:判断 foo 是对象类型assert.property(foo, 'bar')
:判断 foo 包含属性 barassert.propertyVal(foo, 'bar', 'baz')
:判断 foo 的属性 bar 的值为 bazassert.deepEqual(foo, {a: 'foo', b: 'bar'})
:判断 foo 深等于 {a: 'foo', b: 'bar'}
assert 最佳实践
- 使用
typeOf()
或instanceOf()
来判断变量类型 - 尽可能地使用链式调用
- 使用
isTrue()
或isFalse()
来判断变量是否为 true 或 false - 使用
isEmpty()
或isNotEmpty()
来判断数组是否为空 - 使用
include()
或notInclude()
来判断数组或字符串是否包含某一项 - 对于对象类型,使用
property()
来判断属性是否存在 - 对于数组类型,使用
lengthOf()
来判断长度
Chai.js 模块化使用
在实际开发中,测试代码数量通常非常庞大,因此将测试代码分成多个文件和多个测试用例是非常必要的。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------ ----------------- ---------- - ---------------------- ---------- - ---------- ------ -- ---- --- ----- -- --- --------- ---------- - ---------------------------------------- --- --- ---
在上面的代码中,我们使用了 describe 和 it 函数创建了测试套件和测试用例,可以支持多个 describe 和 it。
总结
在 Chai.js 中,expect 和 assert 的使用都很简单,但是根据应用场景选择更合适的方式可以使测试代码更加清晰和易于维护。通常情况下,我们更建议使用 expect 来进行测试,在使用过程中尽可能多的运用链式调用方式。
希望这篇文章能够帮助大家更加深入的了解 Chai.js 的使用方式和最佳实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cee7abb5eee0b525675608