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

