Angular10项目Karma+Jasmine单元测试无法加载util模块报错求助
Angular 10 单元测试
Could not load "util" 报错排查与解决 异常触发源定位
从给出的错误栈可以直接锁定问题触发位置:异常是在src/tests/mocks/gog-mock.js第70行的动态脚本加载错误回调中抛出的,和当前配置的Karma、Jasmine版本没有直接关系,不需要优先调整测试栈依赖版本。
分步排查与解决方式
- 优先检查
gog-mock.js第70行的代码逻辑
触发加载错误的本质是这段代码通过动态创建<script>标签的方式,尝试加载名为util的资源时请求失败,常见原因分两种:- 误在mock逻辑中引用了Node.js内置的
util模块:浏览器环境本身没有Node内置模块的运行时,Angular 10的测试构建默认走浏览器构建目标,不会自动为这类Node内置模块注入兼容polyfill,必然出现加载失败。这种场景直接删掉mock里对util的引用即可——本来就是编写模拟逻辑,完全不需要依赖Node环境的内置模块,把mock中用到的util相关工具方法用纯浏览器可运行的原生JS实现替代就行。 - 原mock逻辑需要加载本地名为
util.js的静态业务资源:这类问题是因为Karma测试服务没有托管对应路径的静态资源,动态发起的资源请求会返回404,进而触发脚本加载失败的错误事件。解决方式是在angular.json的test配置段中,把对应的util.js资源加入assets托管列表,让Karma启动测试服务时能从正确路径返回该资源。
- 误在mock逻辑中引用了Node.js内置的
- 排查业务侧的Node内置模块引用
如果清理完mock的问题后还是复现报错,就检查测试覆盖的组件、依赖的第三方库中有没有直接引用Node内置util模块的逻辑。优先方案是把这类引用替换为浏览器原生的实现,确实无法替换的,可以在src/polyfills.ts中手动引入util对应的浏览器端兼容实现,让构建流程能正常识别打包该模块。 - 补全动态脚本加载的异常兜底
当前gog-mock.js中的动态脚本加载逻辑没有做异常捕获,一旦加载失败就会抛出未处理的Promise rejection,甚至触发Karma服务的未捕获异常导致整个测试进程中断。可以给动态创建的<script>标签的error回调加上兜底逻辑,加载失败时仅打印警告日志,不要向外抛出未捕获的异常,避免单测进程整体崩溃。
内容的提问来源于stack exchange,提问作者CrgioPeca88
相关产品推荐
相关产品推荐

