Angular Jest单元测试用contentChildren报错,@ContentChildren正常
问题描述
在为基础Angular组件编写Jest单元测试时,使用VS Code的Jest Runner扩展运行测试时出现报错:TypeError: Cannot read properties of undefined (reading 'Symbol(SIGNAL)')。
- 测试代码、待测试组件及被Mock的指令代码可在对应复现仓库中查看
- 特殊情况:用
@ContentChildren装饰器替代contentChildren()函数时,测试能正常执行 - 相关问题已在ng-mocks仓库的第8895号Issue中记录
问题成因
该错误源于ng-mocks库对Angular 16+引入的信号式contentChildren() API支持不完善:
contentChildren()是Angular推出的信号式内容查询新API,ng-mocks当前版本的Mock逻辑未正确处理该API的信号内部属性,导致访问Symbol(SIGNAL)时出现未定义错误- 而
@ContentChildren是传统装饰器式API,ng-mocks对其已有成熟的Mock支持,因此不会触发该异常
修复方案
提供两种可行解决途径:
临时替代方案
暂时沿用@ContentChildren装饰器编写组件的内容查询逻辑,避开contentChildren()信号式API,直到ng-mocks修复兼容性问题。
官方修复升级方案
- 跟进ng-mocks仓库第8895号Issue的修复进度,待官方发布修复版本后,升级ng-mocks至对应版本即可解决问题
- 若需紧急临时修复,可手动调整ng-mocks的Mock逻辑(不推荐,维护成本较高):
- 在Mock组件/指令时,为
contentChildren()返回的信号对象补充Symbol(SIGNAL)属性的定义 - 确保Mock的查询结果结构符合Angular信号式API的要求
- 在Mock组件/指令时,为
内容的提问来源于stack exchange,提问作者Pieterjan
相关产品推荐
相关产品推荐

