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

Jest+TypeScript部分Mock模块时mockResolvedValue报错求助

Jest部分Mock时mockResolvedValue报错的解决方法

你在对模块进行部分Mock并尝试设置Mock方法返回值时,遇到以下运行时错误:

mockedEDSM.getSystemValue.mockResolvedValue is not a function
TypeError: mockedEDSM.getSystemValue.mockResolvedValue is not a function

你的Mock代码和测试代码如下:

Mock代码:

jest.mock('../src/models/EDSM', () => ({
  __esModule: true,
  ...jest.requireActual<typeof import('../src/models/EDSM')>('../src/models/EDSM'),
  getSystemValue: jest.fn(),
}));
const mockedEDSM = jest.mocked(EDSM);

测试代码:

it('should test', () => {
  mockedEDSM.getSystemValue.mockResolvedValue(edsmData);
});

TypeScript在IDE中没有给出警告,但运行测试时触发错误。


方案一:直接类型断言获取Mock函数

跳过jest.mocked,直接将目标方法断言为jest.Mock类型,确保运行时能访问到Mock函数的方法:

jest.mock('../src/models/EDSM', () => ({
  __esModule: true,
  ...jest.requireActual<typeof import('../src/models/EDSM')>('../src/models/EDSM'),
  getSystemValue: jest.fn(),
}));

// 断言getSystemValue为jest.Mock类型
const getSystemValueMock = EDSM.getSystemValue as jest.Mock;

it('should test', async () => {
  getSystemValueMock.mockResolvedValue(edsmData);
  // 执行你的测试逻辑
});

方案二:给jest.mocked指定精确泛型

如果需要保留jest.mocked的使用,通过泛型明确模块的类型,让TypeScript识别到getSystemValue是Mock函数:

import EDSM from '../src/models/EDSM';

jest.mock('../src/models/EDSM', () => ({
  __esModule: true,
  ...jest.requireActual<typeof EDSM>('../src/models/EDSM'),
  getSystemValue: jest.fn(),
}));

// 泛型中明确getSystemValue为jest.Mock类型
const mockedEDSM = jest.mocked<typeof EDSM & { getSystemValue: jest.Mock }>(EDSM);

it('should test', async () => {
  mockedEDSM.getSystemValue.mockResolvedValue(edsmData);
  // 执行你的测试逻辑
});

问题原因

TypeScript的类型推断在这里没有告警,是因为jest.mocked默认沿用了原模块的类型定义,但运行时getSystemValue虽然被替换成了jest.fn(),jest.mocked的包装逻辑没有正确传递Mock函数的方法,导致运行时找不到mockResolvedValue。通过类型断言或精确泛型,可以让TypeScript类型和运行时实际结构保持一致,解决该错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:30:09