Angular单元测试报createSpyObj requires a non-empty array错误排查
根因分析
createSpyObj requires a non-empty array or object of method names是Jasmine框架抛出的标准错误,触发条件为调用jasmine.createSpyObj方法时,传入的方法名参数为空数组、空对象、undefined、null等无效值。
异常残留的原因
你删除新增测试和组件后依旧报错,几乎都是编译/运行缓存导致的:
- Angular默认开启增量编译,旧的测试编译产物残留在
.angular缓存目录中,会被测试进程继续加载 - Karma测试服务的后台进程没有完全销毁,仍然加载之前的测试代码快照
UI无报错的原因
报错触发在afterAll生命周期阶段,属于所有测试用例执行完成后的收尾环节,部分版本的Karma前端UI不会将这个阶段的异常主动渲染到页面上,你打开Chrome Headless的开发者控制台就可以看到对应的错误堆栈。
解决步骤
- 停止当前所有正在运行的测试进程
- 删除项目根目录下的
.angular缓存文件夹,清除Angular增量编译缓存 - 全局搜索项目中所有调用
createSpyObj的代码,检查入参是否存在空值的可能,特别注意通过变量动态传入方法名列表的场景:比如先声明变量存储方法名数组,但是变量初始化逻辑异常导致最终传入空值 - 可额外执行
npm cache clean --force清除npm全局缓存 - 重新执行
ng test命令即可
内容的提问来源于stack exchange,提问作者Akila Ekanayake
相关产品推荐
相关产品推荐

