在console.log上,ViewChild变量在单元测试中未定义

时间:2016-04-06 00:32:42

标签: unit-testing angular karma-jasmine

我正在尝试测试具有@ViewChild注释的组件。我正在尝试测试的一个函数调用@ViewChild的元素进行焦点调用。但是,当我尝试注销@ViewChild变量时,它总是undefined。我认为componentFixture.detectChanges()会启动ElementRef,但似乎没有。

有没有办法让它不是undefined

2 个答案:

答案 0 :(得分:3)

我不知道您使用哪个版本的Angular2以及如何初始化测试套件,但detectChanges实例上的ComponentFixture方法负责设置此类字段。

以下是一个示例测试,显示了这一点:

it('should set testElt', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
    return tcb.createAsync(MyList).then((componentFixture: ComponentFixture) => {
      expect(componentFixture.componentInstance.testElt).toBeUndefined();

      componentFixture.detectChanges();

      expect(componentFixture.componentInstance.testElt).toBeDefined();
      var testElt = componentFixture.componentInstance.testElt;
      expect(testElt.nativeElement.textContent).toEqual('Some test');
    });
}));

参见相应的plunkr:https://plnkr.co/edit/THMBXX?p=preview

答案 1 :(得分:2)

您没有显示您的代码但是,您可能已经将其定义为未定义,因为您执行了ViewChild: @ViewChild(MySubComponent) 而不是

@ViewChild('componentref')

然后在你的模板中:

<my-sub-component #componentref></my-sub-component>

当然您需要使用componentFixture.detectChanges()

初始化您的组件