Jest是单元测试的利器,它方便易用,最简单的用法就是其一些列的验证函数,比如toBe和toEqual。它们通常和expect函数一起用,来验证变量是否满足条件。
我们看看那些常用但是易混淆的函数。
toBe
按照验证的方式不同,可以分为验证变量的引用(指针)和验证变量的内容(对象成员)。
toBe是很严格的方法,在内部使用了Object.is。只有当两个简单变量的值相同或引用对象指向同一段内存区域时才通过。更复杂的情况可以参考标准:
这个方法通常用于验证简单变量,或是对象本身,即关心对象这个容器本身。
let a = 1
expect(a).toBe(1)
let list = [{x: 1}, {x: 2}]
let b = list.find(a => a.x === 1)
expect(b).toBe(list[0])
toEqual
与toBe不同,toEqual比较变量的内容,即使它们在内存中不存储在同一个地方。
let a = { x: 1 }
let b = { x: 2 }
let c = { x: 1 }
expect(a).toEqual(b) // fail
expect(a).toEqual(c) // pass
expect(a).toBe(b) // fail
toStrictEqual
toStrictEqual的功能与toEqual相似,但是更加严格。
主要体现在:
- 即使两个对象的成员相同,但原型链不同则不同。
undefined和未定义不兼容。
示例:
let a = { x: 1 }
let b = { x: 1, y: undefined }
let c = [, 1]
let d = [undefined, 1]
expect(a).toEqual(b) // pass
expect(a).toStrictEqual(b) // fail
expect(c).toEqual(d) // pass
expect(c).toStrictEqual(d) // fail
class Sup {}
class A extends Sup {
x = 1
}
class B {
x = 1
}
let a = new A()
let b = new B()
expect(a).toEqual(b) // pass
expect(a).toStrictEqual(b) // fail
toBeCloseTo
由于众所周知的原因(IEEE 754),Javascript中的浮点数需要仔细对待,避免0.1+0.2 == 0.3 // false的情况。
toBeCloseTo用于比较两个数字是否“相等”,两者之间允许有一定的误差。
expect(0.1 + 0.2).toBe(0.3) // fail
expect(0.1 + 0.2).toBeCloseTo(0.3) // pass
这个误差限默认是0.005,可以通过参数设置:
expect(0.2 + 0.1).toBeCloseTo(0.3, 2) // pass
expect(0.1 + 0.2).toBeCloseTo(0.3, 16) // fail
第二个参数的含义是校验小数点后的位数,默认是2。参数(n)和误差限(d)的关系是:
d = 10 ** n / 2