Angular单元测试报错:添加数组push后出现TypeError: Cannot read 'root'
解决方法
问题根源
你直接往someClass[]数组里push空对象{},这不是合法的someClass实例。如果someClass的构造函数或内部逻辑依赖了Router(比如访问router.root),而测试环境中没有给someClass提供对应的mock依赖,就会触发Cannot read properties of undefined (reading 'root')错误。注释push后,组件不会触发someClass相关逻辑,测试自然恢复正常。
具体修复步骤
创建合法的
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) ); // ...其他逻辑 }完善测试配置(可选)
如果组件模板中用到了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] // 添加这行 });检查
someClass实现
确认someClass中是否有访问Router.root的逻辑,如果是,确保在测试时给所有依赖该服务的地方都提供正确的mock,不要依赖全局未配置的Router实例。
内容的提问来源于stack exchange,提问作者Yohanes Aditya
相关产品推荐
相关产品推荐

