上一篇文章考虑了通用匹配器和布尔值匹配器两种情况,本篇文章会针对数字,字符串,数组和异常四种情况的匹配器进行介绍。
数字
对于数字类型的比较,jest 提供了同等的匹配器 toBeGreaterThan(),toBeLessThan()。同时,前面介绍的 toBe() 和 toEqual() 对数字类型的作用是相同的,都是判断两个数字是否相等。
特别的是,浮点数的比较有精度问题,比如 0.1+0.2=0.30000000000000004。这是由于浮点数转成二进制数进行运算后,再转成十进制后出现精度问题。那么,在 jest 中显然不能使用 toBe() 和 toEqual(),而是新增了一个 toBeCloseTo()
test("number result", () => {
expect(2).toBeGreaterThan(1);
expect(2).toBeLessThan(3);
expect(2).toBe(2);
expect(0.1 + 0.2).not.toBe(0.3);
expect(0.1 + 0.2).toBeCloseTo(0.3);
});
在上面的例子中,使用了 toBeGreaterThan(),toBeLessThan(),toBe(),toBeCloseTo()。显然,在浮点数运算的时候,使用 toBeCloseTo() 匹配器更符合。
字符串
字符串匹配的时候可以使用 toMatch(),这个匹配器的传参除了可以使用字符串,还可以使用正则表达式。
test("string matcher", () => {
expect("hello jest!").toMatch("he");
expect("23").toMatch(/^[0-9]+$/i);
});
在上面的例子中,toMatch() 匹配器第一次匹配的是字符串,第二次匹配的是正则表达式,这个正则表达式可以涵盖字符串中包含数字的情况。
数组和可迭代对象
可以使用 toContain() 表明数组或者可迭代对象包含某一项。
test("iterables matcher", () => {
const arr = ["hello", "hi"];
expect(arr).toContain("hi");
expect(new Set(arr)).toContain("hello");
});
从上面的例子可以看出,数组 arr 包含了 hi,而 new Set(arr) 包含了 hello
异常
为了测试一个函数运行的时候是否会抛出异常,可以使用 toThrow(),这个方法可以传入字符串,正则表达式,错误对象或者错误类。
function testError() {
throw new Error("I am error");
}
test("toThrow matcher", () => {
expect(() => testError()).toThrow(/^I/);
});
在上面的例子中,需要测试 testError 函数在执行的时候是否会报错,不能直接调用函数,需要使用一个函数进行包裹。最后可以使用一个正则表达式进行匹配。
小结
本篇文章主要介绍了数字,字符串,数组和可迭代对象,异常四种情况的匹配情况,其中数字匹配的时候在原来 toBe(),toEqual() 的基础上增加了 toBeGreaterThan() ,toBeLessThan(),toBeCloseTo(),字符串匹配的时候使用了 toMatch(),数组和可迭代对象的匹配使用到了 toContain(),一场的匹配使用到了 toThrow()