React中jest.spyOn调用mockResolvedValue后原方法未触发的原因与解决
问题原因
jest.spyOn默认会保留原方法的执行逻辑,但当你链式调用mockResolvedValue时,本质是用语法糖mockImplementation(() => Promise.resolve({}))直接覆盖了原方法的实现,原方法的内部逻辑会被完全替换,所以console.log('run')不会被触发。只单独调用jest.spyOn时没有做实现覆盖,所以原逻辑可以正常执行。
解决方法
根据你的使用场景选择对应方案:
- 如果你只需要监听方法的调用次数、调用参数,不需要修改返回值:直接使用
const testMethod = jest.spyOn(methods, 'run')即可,原方法会正常执行,同时可以通过expect(methods.run).toHaveBeenCalled()这类断言做校验。 - 如果你需要修改方法返回值,同时还要保留原方法的内部逻辑执行:手动调用
mockImplementation封装逻辑,先执行原方法再返回自定义值:
// 先保存原方法的引用 const originalRun = methods.run; const testMethod = jest.spyOn(methods, 'run').mockImplementation((name) => { // 执行原方法逻辑 originalRun(name); // 按需返回自定义值,同步场景用return,异步场景可返回Promise.resolve({}) return {}; });
注意:如果你的原方法是同步方法,使用
mockResolvedValue会把它强制修改为返回Promise的异步方法,若业务无异步返回需求可以直接用mockReturnValue替代,两者的实现覆盖逻辑是一致的。
内容的提问来源于stack exchange,提问作者Asking
相关产品推荐
相关产品推荐

