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');
    });
    
  • .toEqual():这将比较对象或数组,以查看它们的所有属性或元素是否相等,即使它们是嵌套的。
  • 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();
    });
    
  • .toBeFalsy():这将检查某个值是否为假。假值包括 false、0、null、undefined 和空字符串。
  • test('检查值是否为假值', () => {
    
        // 通过,因为 0 为假值
        expect(0).toBeFalsy();
        
        // 通过,因为空字符串为假值
        expect('').toBeFalsy();
    });
    
  • .toBeNull(): 这将检查值是否恰好为空值。
  • test('检查值是否未定义', () => {
        let value;
        
        // 通过,因为值未定义
        expect(value).toBeUndefined();
    });
    
  • .toBeUndefined():这将检查值是否确实未定义。
  • test('检查值是否未定义', () => {
        let value;
        
        // 通过,因为值未定义
        expect(value).toBeUndefined();
    });
    
  • .toBeDefined():这将检查值是否未定义。
  • test('检查值是否已定义', () => {
        const value = 10;
        
        // 通过,因为值已定义(它是 10)
        expect(value).toBeDefined();
    });
    

比较匹配器

比较匹配器检查一个值是否大于、小于或等于另一个值。

  • .toBeGreaterThan():验证一个值是否大于另一个值。
  • test('检查一个数字是否大于另一个数字', () => {
    
        // 通过,因为 10 大于 5
        expect(10).toBeGreaterThan(5);
    });
    
  • .toBeLessThan(): 验证一个值是否小于另一个值。
  • test('检查一个数字是否小于另一个数字', () => {
    
        // 通过,因为 3 小于 5
        expect(3).toBeLessThan(5);
    });
    
  • .toBeGreaterThanOrEqual(): 验证一个值是否大于或等于另一个值。
  • test('检查一个数字是否大于或等于另一个数字', () => {
    
        // 通过,因为 10 等于 10
        expect(10).toBeGreaterThanOrEqual(10);
        
        // 通过,因为 15 大于 10
        expect(15).toBeGreaterThanOrEqual(10);
    });
    
  • .toBeLessThanOrEqual(): 验证一个值是否小于或等于另一个值。
  • test('检查一个数字是否小于或等于另一个数字', () => {
        
        // 通过,因为 3 小于 5
        expect(3).toBeLessThanOrEqual(5);
        
        // 通过,因为 5 等于 5
        expect(5).toBeLessThanOrEqual(5);
    });
    
  • .toBeNull(): 检查值是否为 null。
  • 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');
    });
    
  • .toContainEqual(): 检查一个数组是否包含与另一个数组具有相同值的对象。
  • test('检查数组是否包含具有相等值的对象', () => {
        const users = [{ name: 'John' }, { name: 'Jane' }];
        
        // 通过,因为数组中存在名为 'John' 的对象
        expect(users).toContainEqual({ name: 'John' });
    });
    

函数匹配器

函数匹配器检查函数的行为,特别是当它们抛出错误时。

  • .toThrow():检查函数在调用时是否抛出任何错误。
  • test('检查函数是否抛出错误', () => {
        const throwError = () => { throw new Error('Oops!'); };
        
        // 通过,因为函数抛出错误
        expect(throwError).toThrow();
    });
    
  • .toThrowError(): 检查函数是否抛出特定错误消息。
  • test('检查函数是否抛出特定错误', () => {
        const throwError = () => { throw new Error('特定错误'); };
        
        // 通过,因为错误消息匹配
        expect(throwError).toThrowError('特定错误');
    });
    

Jest Expect 函数

Jest 中的 expect() 函数用于在测试中创建断言。它是每个测试的基础,允许您将代码的实际结果与预期值进行比较。

语法

expect(actualValue).matcher(expectedValue)

expect() 如何工作?

  • actualValue: 您要测试的实际值或输出。
  • ma​​tcher: 检查条件的方法,如 .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]);