在前端开发中,单元测试是非常重要的一环。而 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.calls
、fn.mock.results
和 fn.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