如何Mock导出默认函数?报错configMock.mockReturnValue不是函数
正确Mock默认导出函数的方法
你遇到的问题是因为没有用Jest正确mock目标模块,直接断言原模块的导出为Mock函数是无效的。以下是两种可行的解决方案:
方法1:使用jest.mock自动mock模块
直接用Jest的jest.mock方法mock整个MyConfig模块,默认导出会自动转为jest.Mock类型:
// MyUtil.test.ts import MyUtil from '../MyUtil'; import getConfig from '../MyConfig'; // 自动mock整个模块,默认导出变为jest.Mock jest.mock('../MyConfig'); // 类型断言确保TS识别为Mock函数 const mockGetConfig = getConfig as jest.Mock; describe('tests', () => { it('blah', async () => { // 设置mock返回值 mockGetConfig.mockReturnValue('Foo'); const result = MyUtil.isFoo(); expect(result).toBe(true); // 可添加断言验证逻辑 }); // 可选:清除mock避免测试污染 afterEach(() => { mockGetConfig.mockClear(); }); });
方法2:手动创建mock函数并替换模块导出
如果需要自定义mock实现,可以手动创建mock函数,再替换模块的默认导出:
// MyUtil.test.ts import MyUtil from '../MyUtil'; import * as configModule from '../MyConfig'; // 创建自定义jest.Mock函数 const mockGetConfig = jest.fn(); // 替换模块的默认导出 jest.spyOn(configModule, 'default').mockImplementation(mockGetConfig); describe('tests', () => { it('blah', async () => { mockGetConfig.mockReturnValue('mock-config'); const foo = MyUtil.isFoo(); expect(foo).toBe(false); // 根据返回值验证结果 }); });
额外注意点
- 你的
MyUtil.ts中调用getConfig()时未传入参数,但原函数getConfig要求接收name参数,这会导致运行时参数不匹配,建议补充参数或调整函数定义。
内容的提问来源于stack exchange,提问作者codereviewanskquestions
相关产品推荐
相关产品推荐

