基本类型断言

基本类型断言匹配器有以下几个:

toBe

toBe匹配器在Jest中的主要作用是用于断言基本类型的。其使用Object.is来判断断言结果,而不是使用的全等运算符(===)。

使用toBe 判断对象是否相等的时候,其判断是的两个对象是不是使用的同一个引用,而不是比较其字面值是否相等,如果要比较再个对象的字面量是否相等,请使用toEqual

请不要使用toBe来比较两个浮点数是否相等,因为实现的原因,在JavaScript和其它大多数的语言中,0.1+0.2并不完全等于0.3。( 因为精度丢失)。如果要比较两个浮点数,请使用toBeCloseTo

注意:Object.is和全等运行符在+0-0Number.NaNNaN 的运算上是不一样的。其他时候的运算结果是一致的。区别如图:Object.is vs ===

toEqual

toEqual方法在处理基础类型上和toBe的行为是一致的。但在处理复杂类型(对象,数组,Set,Map等)时,toBe 是直接比较左右两边是否指向同一个引用。而toEqual则会对这些复杂类型进行递归调用toEqual方法,最终判断是字面量是否相等。如:

test("toEqual example", () => {
    const a = {
        id: 1,
        lang: 'JS'
    };
    const b = {
        id: 1,
        lang: 'JS'
    };
    expect(a).toEqual(b);
    expect(a).not.toBe(b);
})

toBeDefined

断言一个变量或一个函数的返回値是已经定义的。比如:

test('assert toBeDefined', () => {
    expect(1).toBeDefined()
})

注意,如果要断言一个变量或返回值是未定义的,相比下not.toBeDefinedtoBeUndefined是更好的选择。

toBeTruthy

断言一个值是真值,而不仅仅是true。比如:

test('assert toBeTruthy', () => {
    expect(1).toBeTruthy();
})

注意:在JavaScript中,只有false,'',0,null,undefinedNaN是假值,其余的都是真值。

如果要判断一个值为假值,相比下not.toBeTruthytoBeFalsy是更好的选择。

toBeFalsy

断言一个值是假值。而不仅仅是false。比如:

test(`assert toBeFalsy`, () => {
    expect(0).toBeFalsy();
})

注意:在JavaScript中,只有false,'',0,null,undefinedNaN是假值,其余的都是真值。

如果要判断一个值为假值,相比下not.toBeFalsytoBeTruthy是更好的选择。

toBeNaN

判断一个值是NaN

test('assert toBeNaN', () => {
    expect(NaN).toBeNaN();
    expect(1).not.toBeNaN();
})

注意,在JavaScript中目前有两种方法来判断一个值是不是NaN

  • Number.isNaN
  • NaN===NaN返回值为false,即NaN是JavaScript中唯一一个不等于自身的。

toBeNull

判断一个值是nulltoBeNull在逻辑上等价于toBe(null)。但当断言失败的时候,toBeNull的提示信息更加友好。

test('assert toBeNull', ()=>{
    expect(null).toBeNull();
})

toBeCloseTo

toBeCloseTo 用于判定两个给定的浮点数在指定的精度下是否相等。之所以需要指定精度,是因为在计算机的底层使用的是二进制表示的十进制的数字。并不是每一个十进制小数都可以使用二进制精确的表示,这就会丢失精度。所以才有了在指定精度下判断相等的方法。

toBeCloseTo的签名为toBeCloseTo(number, numDigits?):

  • numDigits为精度,可选,其默认值为2.其表示Math.abs(expected - received) < 0.005。其中,0.0052 的关系是:(10**-2)/2

示例代码如下:

test('assert 0.1+0.2 and 0.3', () => {
    expect(0.1 + 0.2).toBeCloseTo(0.3, 5)
})

toBeUndefined

用于断言一个变量或返回值是未定义的。比如:

test('assert toBeUndefined', () => {
    let a;
    expect(a).toBeUndefined();
})

注意,如果要断言一个变量或返回值是已定义的,相比下.not.toBeUndefinedtoBeDefined()是更好的选择。

toBeGreaterThan

使用received>expected来进行断言。 比如:

expect('assert toBeGreaterThan', ()=>{
    expect(12).toBeGreaterThan(10)
})

toBeGreaterThanOrEqual

使用received>=expected进行断言。 比如:

expect('assert toBeGreaterThanOrEqual', () => {
    expect(12).toBeGreaterThanOrEqual(12);
})

toBeLessThan

使用received<expected进行断言。 比如:

expect('assert toBeLessThan', ()=>{
    expect(12).toBeLessThan(15)
})

toBeLessThanOrEqual

使用recieved<=expected进行断言。 比如:

expect('assert toBeLessThanOrEqual', ()=>{
    expect(12).toBeLessThanOrEqual(12)
})