Chai 的 matchers 使用指南
原文链接:https://www.jianshu.com/p/a9f3616cb8ca
Chai 是一个非常流行的断言库,它可以结合 Mocha 或其他测试框架使用。Chai 的 matchers 可以帮助我们用更简洁明了的方式编写断言,本文将从入门到进阶为大家介绍 Chai 的 matchers。
- 安装和使用
在使用 Chai 之前,我们需要先通过 npm 安装 Chai:
npm install chai --save-dev
然后在测试文件中引入 Chai:
const chai = require('chai');
在使用 Chai 时,我们通常会使用其中的 expect 函数,它可以接受一个参数,并返回一个 Expect 实例,然后我们就可以在这个实例上调用各种 matchers 来编写断言了。
下面是一个简单的例子:
const { expect } = chai; describe('My first test', () => { it('should return true', () => { expect(true).to.be.true; }); });
在上面的例子中,我们使用 expect 函数返回一个 Expect 实例,然后调用它的 to.be.true 方法来断言 true 是否为真。
- 基本 matchers
除了 to.be.true,Chai 的 matchers 还有很多其他方法。下面我们将为大家介绍一些基本的 matchers:
- to.be.ok:判断一个值是否“真值”,也就是不是 null、undefined、false、0、NaN 等假值(以下简称“falsy”)的值。
- to.equal:判断两个值是否相等,它使用的是 JavaScript 的全等运算符(===)。
- to.have.lengthOf:判断一个对象的长度是否与指定长度相等,支持字符串、数组和类似于数组的对象(比如 arguments)。
- to.include:判断一个数组或字符串是否包含指定的元素或子串。
- to.be.a、to.be.an:判断一个值是否为指定的类型;to.be.a 等同于 to.be.an。
下面是这些方法的用法示例:
-- -------------------- ---- ------- --------------- ---------- -- -- - ---------- ---- -- ----- -- -------- -- -- - ------------- ----------------- --- ---------- ---- -- --- ------ --- ------- -- -- - -------- - --------------- --- ---------- ---- -- ------ --- --------- -------- -- -- - ----------------------------------- --- ---------- ---- -- ----- -------- --- ------- -- -- - ---------- -- ------------------ --- ---------- ---- -- ----- -- -- --------- ------ -- -- - ------------- -------------------------- --- ---
- 比较 matchers
除了基本的 matchers,Chai 还提供了一些用于比较值的 matchers,它们包括:to.be.above、to.be.below、to.be.at.least、to.be.at.most、to.be.within 和 to.be.closeTo。
这些 matchers 用于比较数字和日期类型的值,下面是用法示例:
-- -------------------- ---- ------- ----- --- - --- ------- --------------------- ---------- -- -- - ---------- ---- -- ----- -- ----- --------- -------- -- -- - -------------------------- --- ---------- ---- -- ----- -- ----- --------- -------- -- -- - -------------------------- --- ---------- ---- -- ----- -- -- ----- --------- -------- -- -- - ---------------------------- --- ---------- ---- -- ----- -- -- ---- --------- -------- -- -- - ----------------------------- --- ---------- ---- -- ----- -- ------ --------- ------- -- -- - ------------------------- --- --- ---------- ---- -- ----- -- ----- -- --------- -------- -- -- - ---------------------------- ----- --- ---------- ---- -- ----- -- ----- -- --------- ------ -- -- - ----------------------------- ------- ------ --- ---
上面的代码中,我们使用了 to.be.above、to.be.below、to.be.at.least、to.be.at.most 和 to.be.within 来比较数字类型的值,使用 to.be.closeTo 来比较日期类型的值。to.be.closeTo 计算的是两个日期之间的毫秒差,如果差值小于指定的 tolerance,则断言通过。
- 集合型 matchers
除了比较 matchers,Chai 还提供了很多用于集合型数据类型(比如数组和对象)的 matchers,它们非常实用。下面是其中的一些:
- to.include:判断一个数组或对象是否包含指定的元素或属性。
- to.have.property:判断一个对象是否有指定属性,可以指定属性值。
- to.have.ownProperty:类似 to.have.property,但只判断对象自身的属性,不包括继承属性。
- to.contain.all.keys:判断一个对象是否包含指定的所有属性。
- to.have.lengthOf、to.have.length、to.be.empty:内置了可用于集合型数据类型(比如数组和字符串)的模板。
- to.deep.equal、to.deep.include:类似于 to.equal 和 to.include,但可以比较值的内部结构,适用于非基础类型的值(比如数组和对象)。
下面是这些方法的用法例子:
-- -------------------- ---- ------- -------------------- ---------- -- -- - ---------- ---- -- ----- -------- ------- -- -- - ---------- -- ------------------ --- ---------- ---- -- ------ --- ---------- -- -- - -------- ---- ----- -------------------------- ------- --- ---------- ---- -- ------ --- --- ---------- -- -- - -------- ---- ----- ------------------------------ --- ---------- ---- -- ------ -------- --- --------- ------ -- -- - -------- ---- ------ ---- ----- ----------------------------- ------- --- ---------- ---- -- ----- --- --------- -------- -- -- - ---------- -- ------------------------ --- ---------- ---- -- ------ --- --------- -------- -- -- - ------------- --------------------------- --- ---------- ---- -- ----- -- ------- -- -- - ----------------------- --- ---------- ---- -- ----- -- ---- ----- -- --------- ------- -- -- - -------- ---- --- -- - ---- ----- -- ------------------ ---- --- -- - ---- ----- --- --- --- ---------- ---- -- ----- -------- --------- ------- -- -- - --------- ---- ----- -- - ---- ----- --------------------- ---- ----- --- --- ---
- 异常 matchers
除了上面介绍的 matchers,Chai 还有一些用于判断抛出异常的 matchers,它们包括:to.throw、to.throwError 和 to.throwException。
这些 matchers 用于判断某些操作是否会抛出异常,下面是用法示例:
-- -------------------- ---- ------- ------------------- ---------- -- -- - ---------- ---- -- -------- ------ ------- -- -- - --------- -- - ----- --- --------------- ------------------ --------- --- ---------- ---- -- -------- ------ ----------- -- -- - --------- -- - ----- -------- ----------------------- --- ---
在上面的例子中,我们使用 to.throw 和 to.throwError 来判断函数是否抛出了指定类型的异常,并且判断异常是否包含指定的信息。to.throwException 不指定异常类型,只需判断函数是否抛出异常即可。
- 链式断言
Chai 的 matchers 可以进行链式断言,这样可以使语句变得更加简洁,下面是一个链式断言的例子:
const { expect } = chai; describe('Chainable matchers', () => { it('should be chainable', () => { expect('Hello world').to.be.a('string').and.have.lengthOf(11); }); });
在上面的代码中,我们使用了 and 方法来对两个断言条件进行链接。
- 总结
Chai 的 matchers 可以帮助我们以一种简洁明了的方式编写断言,其中包含了许多实用的方法,可以满足大部分测试场景的需要。在编写测试时,我们应该选择最合适的 matcher 来编写测试用例,并且尽可能运用链式断言来使代码更加简洁易读。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ed4797f6b2d6eab376ba82