jest里的匹配器

你也可以使用Jest的“匹配器”来测试数据。有很多不同的匹配器,所以这篇文章只会介绍最常用的几种。

普通匹配

最简单的的测试方法就是看两个比较值是否相等:

test('2加2等于',()=>{
    expect(2+2).toBe(4);
});

在这段代码中,expect(2 + 2) 返回一个“expectation”对象。针对expectation对象,你除了调用匹配器,其他的你什么也做不了。在这段代码中,.toBe(4)就是匹配器。当Jest运行时,它会跟踪所有的匹配器,如果有失败的匹配就会打印出错误消息。

把toBe换成===效果是一样的。如果你想检查一个对象的值,那么就要用 toEqual 来代替了:

test('对象分配属性',()=>{
    const data={one:1};
    data['two']=2;
    expect(data).toEqual({one:1,two:2});
});

toEqual 会递归的检查数;组或对象的每一个地方。

你同样可以进行反向测试:

test('正数相加不为零',()=>{
    for(let a=1;a<10;a++){
        for(let b=1;b<10;b++){
            expect(a+b).not.toBe(0);
        }
    }
});

很多时候测试需要区分 undefined,null和false,但是你有不想做这些麻烦的事。那jest已经为你准备好了很多助手方法专门解决这些问题。
-- toBeNull 只匹配 null
-- toBeUndefined 只匹配 undefined
-- toBeDefined 是 toBeUndefined 的反匹配
-- toBeTruthy 匹配 if 语句期望得到 true 的
-- toBeFalsy 匹配 if 语句期望得到 false 的

举个例子:

test('null',()=>{
    const n=null;
    expect(n).toBeNull();
    expect(n).toBeDefined();
    expect(n).not.toBeUndefined();
    expect(n).not.toBeTruthy();
    expect(n).toBeFalsy();
});
test('0',()=>{
    const z=0;
    expect(z).not.toBeNull();
    expect(z).toBeDefined();
    expect(z).not.toBeUndefined();
    expect(z).not.toBeTruthy();
    expect(z).toBeFalsy();
});

你应该根据你的代码来选择最佳的匹配器。

数字的比较都用对应的匹配器。

test('2加2',()=>{
    const value=2+2;
    expect(value).toBeGreaterThan(3);//大于匹配器
    expect(value).toBeGreaterThanOrEqual(3.5);//大于或等于匹配器
    expect(value).toBeLessThan(5);//小于匹配器
    expect(value).toBeLessThanOrEqual(4.5);//小于或等于匹配器
    // toBe 和 toEqual 对数字来说效果相等
    expect(value).toBe(4);
    expect(value).toEqual(4);
});

如果你不希望浮点数的测试存在误差,请使用 toBeCloseTo 来代替 toEqual。

test('浮点数相加',()=>{
    const value=0.1+0.2;
    expect(value).not.toBe(0.3);// 错误的方法,因为存在误差。
    expect(value).toBeCloseTo(0.3);// 正确的方法。
});

对于字符串你可以使用 toMatch 配合正则表达式。

test('team 中没有 i ',()=>{
    expect('team').not.toMatch(/I/);
});
test('但是 Christoph 中有 stop',()=>{
    expect('Christoph').toMatch(/stop/);
});

测试数组是否包含特定的元素可以使用 toContain。

const shoppingList=[
    'diapers',
    'kleenex',
    'trash bags',
    'paper towels',
    'beer',
];
test('shopping 列队是有 beer 的',()=>{
    expect(shoppingList).toContain('beer');
});

如果你想测试某个函数被调用的时候是否会抛出错误,请使用 toThrow。

function compileAndroidCode(){
    throw new ConfigError('你使用了错误的JDK');
}
test('编译 android',()=>{
    expect(compileAndroidCode).toThrow();
    expect(compileAndroidCode).toThrow(ConfigError);
    // 你还可以匹配完整的错误消息或正则表达式
    expect(compileAndroidCode).toThrow('你使用了错误的JDK');
    expect(compileAndroidCode).toThrow(/JDK/);
});

你可能感兴趣的