React TS项目Jest测试Monaco Editor遇模块语法错误求助
解决方案
1. 调整Jest配置适配ES模块
在项目根目录的jest.config.js中修改配置,让Jest正确处理monaco-editor这类ES模块:
module.exports = { transform: { '^.+\\.(ts|tsx)$': 'babel-jest', '^.+\\.(js|jsx)$': 'babel-jest', }, // 不对monaco-editor和它依赖的部分包做转译排除 transformIgnorePatterns: [ '/node_modules/(?!(monaco-editor|vscode-languageserver-types)/)', ], // 指定monaco-editor的ES模块入口 moduleNameMapper: { 'monaco-editor': '<rootDir>/node_modules/monaco-editor/esm/vs/editor/editor.main.js', }, }
2. 修正Babel配置确保转译正常
在babel.config.js中配置正确的预设,保证TypeScript和ES模块能被转译为Jest支持的格式:
module.exports = { presets: [ '@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript', ], }
3. Mock Monaco Editor(非必要但实用)
如果你的测试不需要真实渲染编辑器功能,直接在测试文件顶部mock整个模块,避免加载真实的编辑器代码:
jest.mock('monaco-editor', () => ({ editor: { create: jest.fn(() => ({ dispose: jest.fn(), setValue: jest.fn(), getValue: jest.fn(), })), }, }));
4. 处理Web Worker的测试兼容
如果项目中用到了Web Worker,需要给Jest添加Worker的mock:
首先在jest.config.js的moduleNameMapper里添加映射:
moduleNameMapper: { // ...其他已有配置 '\\.worker\\.(ts|js)$': '<rootDir>/__mocks__/workerMock.js', }
然后在项目根目录创建__mocks__/workerMock.js文件,内容如下:
export default class Worker { constructor() { this.onmessage = jest.fn(); this.postMessage = jest.fn(); } }
内容的提问来源于stack exchange,提问作者harsh khatri
相关产品推荐
相关产品推荐

