你也可以使用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/);
});