You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest全局定义mock函数时mock.results[0].value返回undefined问题咨询

问题原因

这是Jest结合Create React App默认配置的预期行为,核心原因是react-scripts默认开启了resetMocks: true配置项。

resetMocks的作用是:Jest会在每一个test用例执行前,自动调用所有mock函数的mockReset()方法,这个方法会执行两个操作:

  • 清空mock函数的所有调用记录,包括mock.calls、mock.results、mock.instances等所有状态
  • 移除用户自定义的mock实现,把mock函数重置为返回undefined的空函数

对应你的场景:

  • 当mockCallback定义在test外部的顶级作用域时:初始化时你给它配置了返回42的实现,但在test用例执行前,这个mock已经被resetMocks自动重置为空函数,所以test内调用时返回值为undefined,自然取到的results[0].value也是undefined
  • 当mockCallback定义在test内部时:resetMocks的自动重置操作已经执行完毕,你新创建的mock不会被重置,自定义的返回42的实现保留,所以执行结果符合预期

解决方案

你可以根据使用场景选择以下方案:

  • 仅单个test使用的mock:直接把mock定义放到test用例内部即可,这也是最推荐的写法,能避免不同test之间的状态泄漏
  • 多个test共用的mock:可以通过beforeEach在每次测试前重新给mock赋值实现:
const mockCallback = jest.fn();
beforeEach(() => {
  mockCallback.mockImplementation(x => 42);
});
  • 特殊场景不需要自动重置mock:可以在项目根目录的Jest配置文件中修改resetMocks: false,或者在单个测试文件顶部加配置注释/** @jest-environment resetMocks: false */,该方案不推荐,容易出现测试用例之间互相影响的问题

文档修改建议

Jest官方文档的代码示例默认是未开启resetMocks配置的场景,你可以到Jest的官方代码仓库提交Issue或者PR,补充说明全局作用域定义的mock会受resetMocks等自动重置配置影响的注意事项。

内容的提问来源于stack exchange,提问作者Pablo LION

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:15:06