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
相关产品推荐
相关产品推荐

