Angular单元测试调用getModels报Cannot read properties of undefined问题
问题原因
- 你没有在测试执行前给
ThinComponent的必填@Input() component赋值,执行spyOn(component.component, 'getModels')时,component.component是undefined,直接读取undefined的getModels属性就会触发该报错。 - 此外组件内的
page属性也未做初始化赋值,后续测试getContents方法时也会触发同类报错,建议同步处理。
解决方案
按如下步骤调整单元测试逻辑即可:
- 在调用spyOn前,先创建
BrComponent和Page的mock对象,赋值给组件实例的对应属性 - 再对
getModels方法做spy stub - 最后执行变更检测和断言
调整后的参考测试代码:
it('should create', () => { // 1. 先初始化mock的BrComponent对象,赋值给组件输入属性 component.component = jasmine.createSpyObj('BrComponent', ['getModels']); // 可选:如果后续要测getContents,也提前mock Page component.page = jasmine.createSpyObj('Page', ['getContent']); // 2. 再spy对应的方法,指定返回值 component.component.getModels.and.returnValue({foo: 'bar'}); // 3. 触发变更检测执行ngOnInit fixture.detectChanges(); expect(component).toBeTruthy(); });
如果不用jasmine的spyObj,也可以手动构造mock对象:
component.component = { getModels: () => ({foo: 'bar'}) } as BrComponent;
内容的提问来源于stack exchange,提问作者Naresh217
相关产品推荐
相关产品推荐

