You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular单元测试报错:添加数组push后出现TypeError: Cannot read 'root'

解决方法

问题根源

你直接往someClass[]数组里push空对象{},这不是合法的someClass实例。如果someClass的构造函数或内部逻辑依赖了Router(比如访问router.root),而测试环境中没有给someClass提供对应的mock依赖,就会触发Cannot read properties of undefined (reading 'root')错误。注释push后,组件不会触发someClass相关逻辑,测试自然恢复正常。

具体修复步骤

  1. 创建合法的someClass实例
    不要直接push空对象,通过new someClass()创建实例,同时为someClass的依赖提供mock:

    // 先mock someClass需要的Router依赖(如果它构造函数里注入了Router)
    const mockClassRouter = jasmine.createSpyObj("Router", ["navigateByUrl"]);
    // 模拟root属性,避免访问undefined
    mockClassRouter.root = { snapshot: {} };
    
    // 在ngOnInit中创建合法实例
    ngOnInit(){
      this.list.push(
        new someClass(mockClassRouter),
        new someClass(mockClassRouter),
        new someClass(mockClassRouter)
      );
      // ...其他逻辑
    }
    
  2. 完善测试配置(可选)
    如果组件模板中用到了list里someClass实例的属性,可在测试模块中添加NO_ERRORS_SCHEMA,忽略模板中未知的属性或组件错误:

    import { NO_ERRORS_SCHEMA } from '@angular/core';
    
    TestBed.configureTestingModule({
      imports: [RouterTestingModule.withRoutes([])],
      declarations: [firstComponent],
      providers: [{ provide: Router, useValue: mockRouter }],
      schemas: [NO_ERRORS_SCHEMA] // 添加这行
    });
    
  3. 检查someClass实现
    确认someClass中是否有访问Router.root的逻辑,如果是,确保在测试时给所有依赖该服务的地方都提供正确的mock,不要依赖全局未配置的Router实例。

内容的提问来源于stack exchange,提问作者Yohanes Aditya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:43:24