Jest mock 和 Stub 规范

在前端开发中,单元测试是非常重要的一环。而 Jest 是一个流行的测试框架,它提供了多种类型的模拟,包括 mock 和 stub。模拟是一种模拟函数行为的技术,以便在测试过程中确定功能是否正确。本文将介绍 Jest 中的 mock 和 stub 规范。

Mock

Mock 是 Jest 提供的一种测试技术,可以替换掉一个函数的真实实现。Mock 通常用来模拟外部依赖,如接口调用、数据库访问、文件读写等等。通过使用 Mock,我们可以控制函数的行为,确保测试的不受外部环境的影响。

创建 Mock

在 Jest 中,我们可以通过 jest.fn() 方法创建 Mock,示例如下:

const fn = jest.fn();

创建了一个空函数,我们可以通过 fn.mock 属性来访问 mock 信息。该属性会返回一个包含许多键值对的对象,常用的有 fn.mock.callsfn.mock.resultsfn.mockImplementation

  • fn.mock.calls 包含测试函数每次被调用的参数列表,可以使用 expect(fn.mock.calls).toHaveLength(count) 检查函数的调用次数。

  • fn.mock.results 包含 mock 的执行结果。如果 mock 未执行,则结果为 undefined。

  • fn.mockImplementation 可以传入一个函数,这个函数会替换掉原函数的实现。

使用 Mock

我们可以通过下面的方法,将 Mock 应用于代码中:

jest.mock('./path/to/module');

例如,我们需要测试一个名为 getUser 的方法,该方法依赖于外部接口进行调用,示例如下:

// user.js

import axios from 'axios';

export function getUser(id) {
  return axios.get('/api/user/' + id);
}

在测试中,我们可以使用 Mock 替换掉 axios 的真实实现。示例如下:

// user.test.js

import { getUser } from './user';
import axios from 'axios';

jest.mock('axios');

test('getUser', async () => {
  const mockUser = { id: 1, name: 'Test User' };
  axios.get.mockResolvedValue({ data: mockUser });

  const user = await getUser(1);

  expect(user).toEqual(mockUser);
  expect(axios.get).toHaveBeenCalled();
});

在这里,我们使用 jest.mock('axios') 来替换掉 axios 模块,axios.get 的真实实现将被 Mock 替换。然后,使用 mockResolvedValue 方法来定义 Mock 的执行结果。

Stub

Stub 是 Jest 提供的另一种测试技术,它可以用于替换函数的实现,从而控制函数的返回结果。Stub 常用于测试复杂的业务逻辑,以保证代码正确性和可维护性。

创建 Stub

在 Jest 中,我们可以使用 jest.spyOn 方法来创建 Stub。该方法会返回一个实例对象,我们可以设置返回结果或替换掉函数的实现。示例如下:

const obj = { method: () => {} }
const spyObj = jest.spyOn(obj, 'method')

这里我们创建了一个实例 spyObj,它是对 obj.method 的一个 Stub。我们可以使用 spyObj.mock 设置、访问 Stub 的相关信息。

使用 Stub

在测试代码中,我们可以使用 Stub 替代原函数,来方便测试业务逻辑的正确性。示例如下:

const obj = { method: () => {} }
const spyObj = jest.spyOn(obj, 'method')

test('should return correct value', () => {
  spyObj.mockReturnValue(42);

  expect(obj.method()).toBe(42);
  expect(spyObj.mock.calls.length).toBe(1);
})

在这个例子中,我们首先使用 jest.spyOn 创建了一个 Stub,然后设置了返回值为 42。在测试例子中,我们调用 obj.method,会返回 42,同时也会使 Stub 记录下自己已经被调用,并在测试结束后可以通过 mock.calls 来验证。

总结

在本文中,我们学习了 Jest 中的 mock 和 stub 规范。Mock 可以帮助我们对外部依赖进行模拟,而 Stub 可以方便地控制函数的返回值。我们可以通过使用这两种技术,来保证代码的正确性和可维护性。在实际开发中,我们应该根据实际情况进行选择,准确使用这两种模拟技术。

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