Jest 解析之匹配器(下)

113 阅读2分钟

上一篇文章考虑了通用匹配器和布尔值匹配器两种情况,本篇文章会针对数字,字符串,数组和异常四种情况的匹配器进行介绍。

数字

对于数字类型的比较,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()

参考资料:jestjs.io/docs/using-…