Jest 匹配器可以用不同的方式去测试值,本文会介绍几个常用的匹配器,详细的匹配器 API 可以去官网。
通用匹配器
toBe() 可以用于基础类型值的测试,底层使用的 Object.is,这个方法比 === 更加精确。在判断 NaN 的时候,NaN===NaN 得到的是 false,而 Object.is(NaN,NaN) 得到是 true。此外,在判断 +0 是否等于 -0 的时候,=== 给出的结果是相等,而 Object.is 的结果是不相等。
匹配对象的时候可以使用 toEqual() 方法,这个方法会递归检查对象的每个字段。但是,判断对象是否严格相等的时候需要使用 toStrictEqual() 方法。这个方法会不但会检查对象或数组中存在的 undefined 情况,还会判定对象实例和对应的对象字面量不相等。
test("common matchers test", () => {
let x = 20;
let obj1 = { name: "leon" };
let obj2 = { name: "leon" };
let obj3 = { name: "leon", age: undefined };
expect(20).toBe(20);
expect(obj1).not.toBe(obj2);
expect(obj1).toEqual(obj2);
expect(obj1).toEqual(obj3);
expect(obj1).not.toStrictEqual(obj3);
});
从上面的例子可以看出,toBe() 方法可以得出 obj1 和 obj2 是不相等的,而toEqual() 方法得出 obj1 和 obj2 是相等的,所以一般使用 toBe() 进行基础类型值的匹配,使用 toEqual() 进行对象类型的匹配。toEqual() 方法得出 obj1 和 obj3 是相等的,而 toStrictEqual() 方法得出 obj1 和 obj3 是不相等的,所以当匹配的对象中含有 undefined 的时候需要使用 toStrictEqual() 进行匹配。
布尔值
对应 javascript 的布尔值,jest 也有相应的匹配器 toBeTruthy() 和 toBeFalsy()。javascript 中会转化成 false 的情况有 '',0,NaN,false,null,undefined,0n。
test("false result", () => {
expect("").toBeFalsy();
expect(null).toBeFalsy();
expect(undefined).toBeFalsy();
expect(NaN).toBeFalsy();
expect(0).toBeFalsy();
expect(0n).toBeFalsy();
expect(false).toBeFalsy();
});
上面的例子可以看出, '',0,NaN,false,null,undefined,0n 都可以使用 toBeFalsy() 方法进行匹配。
小结
本文主要介绍了值相等和布尔值判断两种匹配器,其中 toBe() 可以用作基础类型值的匹配判断, toEqual() 可以用作对象类型值的匹配判断,toBeTruthy() 可以用作条件为真的匹配判断,toBeFalsy() 可以用作条件为假的匹配判断。