jest.fn()是jest中创建模拟函数的核心方法,用于记录调用、控制返回值(mockreturnvalue/mockimplementation)、模拟异步行为(mockresolvedvalue/mockrejectedvalue)并支持清理重置。

在 Jest 中,jest.fn() 是创建模拟函数(mock function)最常用的方式,特别适合模拟回调函数——比如事件处理、Promise 的 then/catch、第三方 SDK 的回调参数等。关键在于:它不仅能“假装执行”,还能记录调用痕迹、控制返回值、甚至抛出错误,让测试更可控。
一、基础用法:把 jest.fn() 当作回调传入
很多 API(如 Array.prototype.forEach、addEventListener、setTimeout、或自定义函数)接受一个回调函数作为参数。这时直接传入 jest.fn() 即可:
- 它不会报错,也不会真正执行逻辑(除非你手动定义实现)
- 调用后自动记录:被调用了几次、每次的参数、返回值等
例如:
```jstest('forEach 调用回调 3 次', () => {
const mockCallback = jest.fn();
[1, 2, 3].forEach(mockCallback);
expect(mockCallback).toHaveBeenCalledTimes(3);
expect(mockCallback).toHaveBeenNthCalledWith(1, 1, 0, [1, 2, 3]);
expect(mockCallback).toHaveBeenNthCalledWith(2, 2, 1, [1, 2, 3]);
});
```
二、控制返回值:用 mockReturnValue 或 mockImplementation
当回调需要返回特定值(比如用于链式调用或条件判断),可以用:
-
mockReturnValue(value):每次调用都返回固定值 -
mockImplementation(fn):传入一个真实函数,支持逻辑判断和动态返回
例如模拟 Promise 链中的 then 回调:
test('then 回调返回处理后的数据', () => {
const mockThen = jest.fn().mockReturnValue('processed');
const result = Promise.resolve('raw').then(mockThen);
return result.then(data => {
expect(data).toBe('processed');
expect(mockThen).toHaveBeenCalledWith('raw');
});
});
```
三、模拟异步回调或抛错:mockResolvedValue / mockRejectedValue
如果回调本身是异步的(如 fetch 的 then 或 catch),推荐用专门的快捷方法:
-
mockResolvedValue(value)→ 让模拟函数返回一个已 resolve 的 Promise -
mockRejectedValue(error)→ 返回一个已 reject 的 Promise
例如模拟失败的网络请求回调:
```jstest('catch 回调接收错误', () => {
const mockCatch = jest.fn();
Promise.reject(new Error('Network failed'))
.catch(mockCatch);
expect(mockCatch).toHaveBeenCalledTimes(1);
expect(mockCatch).toHaveBeenCalledWith(expect.any(Error));
});
```
四、清理与重置:避免测试间干扰
每个测试应独立。Jest 提供了自动清理机制,但建议显式重置:
-
jest.clearAllMocks():清空所有调用记录(保留实现) -
jest.resetAllMocks():清空记录 + 重置 mock 实现为默认(undefined) - 通常放在
beforeEach或afterEach中
例如:
```jsbeforeEach(() => {
jest.clearAllMocks();
});
```
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











