在前端开发过程中,我们常常需要测试我们的代码。而在测试过程中,我们有许多需要模拟的依赖项,例如网络请求、数据存储、系统时间等等。这时候,Jest 提供的 Mock 功能就非常重要了。
在 Jest 中,我们可以使用 Mocks 来模拟一个依赖项的行为,并且在测试中使用这个 Mock 代替实际依赖项。这可以帮助我们更方便的编写测试用例并且避免不必要的网络请求、文件操作等开销。下面,我们将会介绍 Jest 中 Mocks 的高级用法。
基本使用
在 Jest 中,我们可以使用以下两种方式来创建一个 Mock:
手动创建 Mock
手动创建 Mock 的方式非常简单,我们只需使用 Jest 提供的 jest.fn() 方法,如下所示:
const myFunction = jest.fn();
这个 Mock 将会代替我们的实际函数,并且记录它的调用情况以及参数。在测试用例中,我们可以调用这个 Mock,对其进行断言,例如:
myFunction(); expect(myFunction).toHaveBeenCalled(); expect(myFunction.mock.calls.length).toBe(1); expect(myFunction.mock.calls[0][0]).toBe('param1');
自动创建 Mock
除了手动创建 Mock 外,Jest 还提供了一种自动创建 Mock 的方式。当我们通过 jest.mock()
方法来 mock 一个依赖时,Jest 会帮我们自动创建一个 Mock,如下所示:
jest.mock('./myDependency'); const myDependency = require('./myDependency');
通过这种方式,我们就可以将 myDependency 这个依赖项的行为进行模拟,例如:
myDependency.mockImplementation(() => 'mocked'); expect(myDependency()).toBe('mocked');
这里我们将 myDependency
设置为一个 Mock 实现,并断言调用后返回 'mocked'。
高级用法
除了 Jest 的基本 Mock 功能以外,还有一些更高级的用法,让我们能够更方便地编写测试用例。
模拟模块
在某些情况下,我们需要模拟一个模块的行为。例如,我们需要模拟一个 HTTP 模块来模拟 API 请求的行为。我们可以通过以下方式来模拟模块:
jest.mock('axios', () => ({ get: jest.fn(() => Promise.resolve({ data: 'mocked data' })), })); const axios = require('axios');
这里我们通过 jest.mock
方法来模拟 axios 模块,通过回调函数返回一个 get
方法的 Mock 实现,来模拟 HTTP 请求的返回。在测试用例中,我们可以对 axios.get
这个 Mock 进行断言,来确保其发生了我们期望的调用:
await axios.get('http://example.com'); expect(axios.get).toHaveBeenCalledWith('http://example.com');
Mock 命名空间
有时候,我们需要在一个模块中 mock 多个依赖项。为了避免 Mock 发生冲突,我们可以使用 Mock 命名空间来分别定义 Mock。例如:
jest.mock('./myDependency', () => ({ func1: jest.fn(() => 'mocked'), func2: jest.fn(() => 'mocked'), })); const myDependency = require('./myDependency');
这里我们定义了一个名为 myDependency
的 Mock 命名空间,我们可以在其中定义多个 Mock。在测试用例中,我们可以对这个命名空间下的 Mock 进行断言,例如:
expect(myDependency.func1()).toBe('mocked'); expect(myDependency.func1).toHaveBeenCalled(); expect(myDependency.func2()).toBe('mocked'); expect(myDependency.func2).toHaveBeenCalled();
自动模块 Mock
有时候我们需要模拟一个模块,但是这个模块没有定义导出,而是通过依赖注入的方式来使用。此时,我们可以使用 Jest 提供的自动模块 Mock 功能来模拟这个模块的返回值。例如:
-- -------------------- ---- ------- -- ----------- ----- ------------ - -------------------------- -------------- - ------- -- -------------------- -- ---------------- ----- -------- - ---------------------- --------------------------- -- -- -- ------ ---------- -- ---------- ---- ---------- ---------- -- -- - ------------------------------------------ ---
这里我们使用 jest.mock
方法来模拟 myDependency
模块,模拟其返回的 func1
方法的返回值为 'mocked'。在测试用例中,我们调用 myModule('param1')
方法并对其返回值进行断言,由于 myModule
中使用了 myDependency
模块,所以我们在测试用例中调用的是 Mock 后的版本。
总结
Jest 中的 Mock 功能是非常强大的,使用 Mock 可以帮助我们更方便地编写测试用例以及避免不必要的开销。在本文中,我们介绍了 Jest 中 Mock 的基本用法以及几种高级用法。建议在编写 Jest 测试用例时,多加尝试使用 Mock 功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64707bb3968c7c53b0e9c13d