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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:48:00