Jest 测试中如何 mock 外部 JavaScript 库

Jest 是一个广泛使用的 JavaScript 测试框架,它提供了许多有用的功能,例如断言库、代码覆盖率和 mock 功能,可以帮助前端开发者快速、可靠地测试自己的代码。 在 Jest 测试中,我们经常需要 mock 外部 JavaScript 库,这些库可能是第三方库,也可能是我们在项目中自己编写的库。在这篇文章中,我们将探讨如何在 Jest 测试中 mock 外部 JavaScript 库。

Jest 中的 Mock 功能

在 Jest 中,我们可以使用 mock 函数来 mock 任何 JavaScript 函数或对象。 mock 函数可以模拟原始函数或对象的行为,从而允许我们在测试中更容易地控制和测试代码的交互。 mock 函数允许我们在测试中捕获函数调用和返回值,并提供灵活的 mock 功能以满足测试需求。

Jest 提供了两种类型的 mock 函数:手动 mock 和自动 mock。 手动 mock 是通过手动编写文件或者使用 Jest 提供的 mock 函数来实现的。手动 mock 提供了极大的灵活性,可以完全控制 mock 函数的行为。 自动 mock 是 Jest 自动为我们生成的 mock,能够自动 mock 函数和模块,对于一些简单的场景,可以省去手动 mock 的工作,提高项目开发效率。

Mock 外部 JavaScript 库

Mock 外部 JavaScript 库是 Jest 测试中的常见需求。通常,我们需要 mock 一些第三方库,以模拟它们的返回值,因为它们可能需要访问外部资源,例如网络接口,数据库等,这些资源在测试中是不可用的。Mock 外部 JavaScript 库可以让我们在测试中更容易地测试代码的交互,同时保持代码的可测试性。

下面是一个简单的示例,演示如何在 Jest 中 mock 外部 JavaScript 库:

假设我们正在编写一个函数,它依赖于一个名为 myOtherLib 的外部库。

import myOtherLib from 'myotherlib';

export function myFunction() {
  const result = myOtherLib.someFunction();
  return result;
}

我们可以使用 Jest 的手动 mock 来 mock myOtherLib 库:

import myFunction from './myFunction';

// mock myOtherLib 模块
jest.mock('myotherlib', () => ({
  someFunction: jest.fn(() => 'mocked value'),
}));

describe('myFunction', () => {
  it('should call someFunction and return its result', () => {
    const result = myFunction();
    expect(myOtherLib.someFunction).toHaveBeenCalled();
    expect(result).toBe('mocked value');
  });
});

在这个例子中,我们使用 jest.mock 函数手动 mock 了 myOtherLib 模块。我们传入一个返回指定值的模拟对象,模拟对象中的 someFunction 函数总是返回 mocked value。然后我们在测试用例中验证了函数的正确性。注意,在使用手动 mock 时,我们需要将 './myFunction' 导入测试代码中,并将其实例化为我们要测试的实际函数。

需要注意的一点是,当我们手动 mock 外部库时,我们可能需要 mock 所有依赖项。如果我们在测试中仅仅 mock 一个库而没有 mock 与它关联的任何其他库,那么测试将会失败。

总结

在 Jest 测试中,mock 外部 JavaScript 库是一个常见的需求,这个过程可以帮助我们更好地测试代码的交互。Jest 提供了两种类型的 mock 函数(手动 mock 和自动 mock),可以帮助我们更容易地控制和测试代码。手动 mock 可以提供更大的灵活性,自动 mock 能够省去大量的手动 mock。在使用 Jest mock 外部 JavaScript 库时,我们应该确保 mock 所有的依赖项。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b4871dadd4f0e0ffd6fbae