Jest - 核心概念
在本章中,我们将介绍流行的 JavaScript 测试框架 Jest 的核心概念。您将学习如何使用 Jest 的匹配器和函数来测试不同的数据类型,确保您的代码按预期运行。
Jest 的核心概念
Jest 匹配器
Jest 中的匹配器是帮助您验证测试值是否满足特定条件的函数。它们与 expect() 函数 一起使用,以进行断言并确保代码按预期运行。
匹配器的类型
以下是 Jest 中的主要匹配器类型:
相等匹配器
相等匹配器可帮助您检查两个值在不同情况下是否相等方法。
- .toBe():检查两个值是否严格相等(使用 ===)。它主要用于比较数字、字符串或布尔值等原始值。
test('checks if values are strictly equal', () => { // 通过,因为 5 === 5 expect(5).toBe(5); // 通过,因为两个字符串完全相同 expect('Hello').toBe('Hello'); });
test('检查对象和数组是否完全相等', () => { // 通过,因为两个对象相同 expect({ name: 'Alice' }).toEqual({ name: 'Alice' }); // 通过,因为数组具有相同的元素 expect([1, 2, 3]).toEqual([1, 2, 3]); });
真值匹配器
真值匹配器可帮助您检查某个值是真还是假。
- .toBeTruthy():这将检查某个值是否为真,即它在布尔上下文中计算结果为真。例如,非空字符串和非零数字为真。
test('checks if value is truthy', () => { // 通过,因为非空字符串为真 expect('Hello').toBeTruthy(); // 通过,因为 1 为真 expect(1).toBeTruthy(); });
test('检查值是否为假值', () => { // 通过,因为 0 为假值 expect(0).toBeFalsy(); // 通过,因为空字符串为假值 expect('').toBeFalsy(); });
test('检查值是否未定义', () => { let value; // 通过,因为值未定义 expect(value).toBeUndefined(); });
test('检查值是否未定义', () => { let value; // 通过,因为值未定义 expect(value).toBeUndefined(); });
test('检查值是否已定义', () => { const value = 10; // 通过,因为值已定义(它是 10) expect(value).toBeDefined(); });
比较匹配器
比较匹配器检查一个值是否大于、小于或等于另一个值。
- .toBeGreaterThan():验证一个值是否大于另一个值。
test('检查一个数字是否大于另一个数字', () => { // 通过,因为 10 大于 5 expect(10).toBeGreaterThan(5); });
test('检查一个数字是否小于另一个数字', () => { // 通过,因为 3 小于 5 expect(3).toBeLessThan(5); });
test('检查一个数字是否大于或等于另一个数字', () => { // 通过,因为 10 等于 10 expect(10).toBeGreaterThanOrEqual(10); // 通过,因为 15 大于 10 expect(15).toBeGreaterThanOrEqual(10); });
test('检查一个数字是否小于或等于另一个数字', () => { // 通过,因为 3 小于 5 expect(3).toBeLessThanOrEqual(5); // 通过,因为 5 等于 5 expect(5).toBeLessThanOrEqual(5); });
test('checks if value is null', () => { const value = null; // 通过,因为值确实为 null expect(value).toBeNull(); });
数组匹配器
数组匹配器检查数组是否包含特定元素或是否符合条件。
- .toContain():检查数组是否包含特定元素。
test('检查数组是否包含特定元素', () => { // 通过,因为数组中有 2 expect([1, 2, 3]).toContain(2); // 通过,因为数组中有 'banana' expect(['apple', 'banana']).toContain('banana'); });
test('检查数组是否包含具有相等值的对象', () => { const users = [{ name: 'John' }, { name: 'Jane' }]; // 通过,因为数组中存在名为 'John' 的对象 expect(users).toContainEqual({ name: 'John' }); });
函数匹配器
函数匹配器检查函数的行为,特别是当它们抛出错误时。
- .toThrow():检查函数在调用时是否抛出任何错误。
test('检查函数是否抛出错误', () => { const throwError = () => { throw new Error('Oops!'); }; // 通过,因为函数抛出错误 expect(throwError).toThrow(); });
test('检查函数是否抛出特定错误', () => { const throwError = () => { throw new Error('特定错误'); }; // 通过,因为错误消息匹配 expect(throwError).toThrowError('特定错误'); });
Jest Expect 函数
Jest 中的 expect() 函数用于在测试中创建断言。它是每个测试的基础,允许您将代码的实际结果与预期值进行比较。
语法
expect(actualValue).matcher(expectedValue)
expect() 如何工作?
- actualValue: 您要测试的实际值或输出。
- matcher: 检查条件的方法,如 .toBe()、.toEqual() 或 .toContain()。
- expectedValue: 您期望从代码中获得的值。
示例
const result = 5 + 5; // 通过,因为 5 + 5 等于 10 expect(result).toBe(10);
解释
- expect(result): 为结果值创建期望。
- .toBe(10): 检查结果是否严格等于 10。如果是,则测试通过。
这是使用 Jest 的 expect() 函数 测试代码的基本结构。
Jest 测试原语
在 Jest 中,测试数字、字符串和布尔值等原始值很简单。您可以使用 .toBe() 之类的匹配器来检查这些原始值是否与预期结果匹配。
测试数字
对于测试数字,您可以使用 .toBe() 匹配器 来检查该值是否完全等于您的预期值。
示例:验证两个数字的总和。
// 通过,因为 10 + 5 等于 15 expect(10 + 5).toBe(15);
测试字符串
还使用 .toBe() 匹配器 测试字符串以检查是否完全匹配。
示例:检查两个字符串是否相同
// 通过,因为字符串完全相同 expect('hello').toBe('hello');
测试布尔值
可以测试布尔值以检查它们是真值还是假值。
- .toBeTruthy():用于检查值是否为真值(即,计算结果为真)。
- .toBeFalsy():用于检查值是否为假值(即,计算结果为假)。
示例
// 通过,因为 true 是真值 expect(true).toBeTruthy(); // 通过,因为 false 是假值 expect(false).toBeFalsy();
Jest 测试对象
在 Jest 中测试对象时,检查其属性是否与预期值匹配非常重要。您可以根据比较级别使用不同的匹配器。
深度平等
此处,.toEqual() 验证用户对象是否具有与预期对象完全相同的属性和值。
- .toEqual():使用 .toEqual() 检查两个对象或数组是否完全相同,包括所有属性和值。
const user = { name: 'Alice', age: 25 }; expect(user).toEqual({ name: 'Alice', age: 25 }); // 通过
部分匹配
在本例中,.toMatchObject() 检查用户对象是否包含值为"Alice"的 name 属性,但不需要匹配整个对象。
- .toMatchObject():使用 .toMatchObject() 检查对象是否包含特定属性,而无需匹配整个对象。
expect(user).toMatchObject({ name: 'Alice' }); // 通过
属性匹配
此处,.toHaveProperty() 检查用户对象是否包含 name 属性,并验证 age 属性是否具有值 25。
- .toHaveProperty():使用 .toHaveProperty() 检查对象是否具有特定属性,并可选择检查其值。
expect(user).toHaveProperty('name'); // 通过 expect(user).toHaveProperty('age', 25); // 通过
Jest 测试数组
在 Jest 中,您可以使用匹配器(如 .toContain()、.toHaveLength() 和 .toEqual())测试数组以验证其内容和属性。
检查数组是否包含值
要测试数组是否包含特定元素,请使用 .toContain() 方法。
const numbers = [1, 2, 3, 4]; // 通过,因为数组包含 3 expect(numbers).toContain(3);
检查数组的长度
您可以使用 .toHaveLength() 方法验证数组中的元素数量。
// 通过,因为数组有 4 个元素 expect(numbers).toHaveLength(4);
检查数组相等性
要检查两个数组是否完全相等(即具有相同顺序的相同元素),请使用 .toEqual() 方法。
// 通过,因为数组相等 expect([1, 2, 3]).toEqual([1, 2, 3]);