如何在Jest中Mock来自Hook的带.then调用的异步函数并解决报错
错误原因
- Mock逻辑倒置:你当前的写法是给
postCompleteContent函数设置返回值为包含postCompleteContent属性的对象,而非把模块导出的postCompleteContent本身替换为Mock函数,会导致实际导入的方法不是可执行的函数,触发类型错误。 - 返回值不匹配:原
postCompleteContent是异步函数,返回的是Promise<number>类型的响应状态码,你写的Mock返回普通对象{data: 201},且没有用Promise包装,调用.then时也会报错。 - 默认Mock无返回值:无工厂函数的
jest.mock只会生成空的Mock函数,没有预设符合原函数逻辑的返回值,无法满足业务判断需求。
正确Mock方案
方案1:全局工厂函数Mock(适合所有用例共用同一Mock逻辑的场景)
直接在测试文件顶部和导入语句同层级定义:
jest.mock('~/hooks/worldhooks', () => ({ postCompleteContent: jest.fn().mockResolvedValue(201) }))
之后直接导入postCompleteContent即可做调用断言:
import { postCompleteContent } from '~/hooks/worldhooks' // 测试用例内断言 expect(postCompleteContent).toHaveBeenCalledWith('预期的contentId', '预期的playerId')
方案2:单用例动态Spy(适合不同用例需要不同返回值的场景)
导入整个模块后针对目标方法做Spy处理:
import * as worldHooks from '~/hooks/worldhooks' test('验证内容完成调用逻辑', () => { const mockPost = jest.spyOn(worldHooks, 'postCompleteContent').mockResolvedValue(201) // 触发组件的相关交互逻辑 expect(mockPost).toHaveBeenCalled() // 用例结束后恢复原函数,避免影响其他测试 mockPost.mockRestore() })
内容的提问来源于stack exchange,提问作者João Pedro Rodrigues
相关产品推荐
相关产品推荐

