Using Matchers
Jest 使用匹配器让你通过不同的方式测试值。不同的匹配器实在太多了,所以这里只尝试列出最有用的。
普通匹配器 #
最简单的测试值的方法是看是否精确匹配。
test('two plus two is four', () => { expect(2 + 2).toBe(4); });
在此代码中,expect (2 + 2)
返回一个"期望"的对象。 你通常不会对这些期望对象调用过多的匹配器。 在此代码中,.toBe(4)
是匹配器。 当 Jest 运行时,它会跟踪所有失败的匹配器,以便它可以为你打印出很好的错误消息。
toBe
使用 ===
来测试完全相等。如果你想要检查的是一个对象,请使用 toEqual
:
test('object assignment', () => { const data = {one: 1}; data['two'] = 2; expect(data).toEqual({one: 1, two: 2}); });
toEqual
递归检查对象或数组的每个字段。
您还可以测试相反的匹配︰
test('adding positive numbers is not zero', () => { for (let a = 1; a < 10; a++) { for (let b = 1; b < 10; b++) { expect(a + b).not.toBe(0); } } });
Truthiness #
在测试中,你有时需要区分 undefined
、 null
,和 false
,但有时你又不需要区分。 Jest 让你明确你想要什么。
toBeNull
只匹配null
toBeUndefined
只匹配undefined
toBeDefined
与toBeUndefined
相反toBeTruthy
匹配任何if
语句为真toBeFalsy
匹配任何if
语句为假
例如:
test('null', () => { const n = null; expect(n).toBeNull(); expect(n).toBeDefined(); expect(n).not.toBeUndefined(); expect(n).not.toBeTruthy(); expect(n).toBeFalsy(); }); test('zero', () => { const z = 0; expect(z).not.toBeNull(); expect(z).toBeDefined(); expect(z).not.toBeUndefined(); expect(z).not.toBeTruthy(); expect(z).toBeFalsy(); });
您应该使用匹配器最精确地对应您的代码你想要什么。
数字 #
大多数的比较数字有等价的匹配器。
test('two plus two', () => { const value = 2 + 2; expect(value).toBeGreaterThan(3); expect(value).toBeGreaterThanOrEqual(3.5); expect(value).toBeLessThan(5); expect(value).toBeLessThanOrEqual(4.5); // toBe and toEqual are equivalent for numbers expect(value).toBe(4); expect(value).toEqual(4); });
对于比较浮点数相等,使用 toBeCloseTo
而不是 toEqual
,因为你不希望测试取决于一个小小的舍入误差。
test('adding floating point numbers', () => { const value = 0.1 + 0.2; expect(value).not.toBe(0.3); // It isn't! Because rounding error expect(value).toBeCloseTo(0.3); // This works. });
字符串 #
您可以检查对具有 toMatch
正则表达式的字符串︰
test('there is no I in team', () => { expect('team').not.toMatch(/I/); }); test('but there is a "stop" in Christoph', () => { expect('Christoph').toMatch(/stop/); });
数组 #
你可以检查数组是否包含特定子项使用 toContain
︰
const shoppingList = [ 'diapers', 'kleenex', 'trash bags', 'paper towels', 'beer', ]; test('the shopping list has beer on it', () => { expect(shoppingList).toContain('beer'); });
例外 #
如果你想要测试的特定函数抛出一个错误,在它调用时,使用 toThrow
。
function compileAndroidCode() { throw new ConfigError('you are using the wrong JDK'); } test('compiling android goes as expected', () => { expect(compileAndroidCode).toThrow(); expect(compileAndroidCode).toThrow(ConfigError); // You can also use the exact error message or a regexp expect(compileAndroidCode).toThrow('you are using the wrong JDK'); expect(compileAndroidCode).toThrow(/JDK/); });
以及更多 #
这些只是浅尝辄止。匹配器的完整列表,请查阅 参考文档。
一旦你学会关于可用的匹配器,好的下一步是查阅 Jest 如何让你 测试异步代码。