宿主应用Jest测试:使用虚拟模拟仍无法Mock联邦模块,需额外配置?
问题:Jest Mock模块联邦远程模块时提示找不到模块
我尝试在Jest测试中Mock一个模块联邦的远程模块,操作如下:
业务代码文件:
// eslint-disable-next-line import/no-unresolved import { EventBus } from 'federated-module/main';
对应的测试文件:
jest.mock('federated-module/main', () => ({ EventBus: () => void }), { virtual: true });
运行测试时收到错误:
● Test suite failed to run Cannot find module 'federated-module/main' from 'path-to-file-using-modlue-federated-import/index.js'
请问是否需要在Jest配置中进行额外设置?
解决方案
需要调整Jest配置并修正Mock写法,具体如下:
- 添加Jest模块映射配置
在jest.config.js中配置moduleNameMapper,让Jest能识别这个联邦模块的路径,避免去查找真实的模块文件:
module.exports = { // 其他已有配置... moduleNameMapper: { '^federated-module/main$': '<rootDir>/__mocks__/federated-module-main.js' } };
你可以在__mocks__目录下创建对应的Mock文件,内容示例:
module.exports = { EventBus: jest.fn() };
- 修正Mock函数的语法错误
你当前Mock中的() => void是无效语法,需要改为合法的函数返回,比如空函数或Jest mock函数:
jest.mock('federated-module/main', () => ({ EventBus: jest.fn() // 或者 () => {} }), { virtual: true });
- 检查Jest版本兼容性
{ virtual: true }选项要求Jest版本在26.0.0及以上,如果你的版本过低,该选项会失效,建议升级到符合要求的版本。
如果不想每个测试文件都重复写Mock代码,也可以在Jest配置的setupFilesAfterEnv中添加全局Mock脚本,一次性完成该联邦模块的Mock配置。
内容的提问来源于stack exchange,提问作者rand_user91
相关产品推荐
相关产品推荐

