我正在测试如下组件 @Component({ selector: 'my-component', template: ` my-nested-component [state]="state"/my-nested-component `, encapsulation: ViewEncapsulation.Native})export class MyComponent {} 单元测试我的组件时,我想获
@Component({ selector: 'my-component', template: ` <my-nested-component [state]="state"></my-nested-component> `, encapsulation: ViewEncapsulation.Native }) export class MyComponent {}
单元测试我的组件时,我想获得对嵌套组件MyOtherComponent的引用.如果我的组件没有使用封装,或者它使用了模拟封装,我可以使用:
let fixture = TestBed.createComponent(MyComponent); let nestedComponent = fixture.debugElement.query(By.directive(MyNestedComponent))
获取对组件的引用.
但在这种情况下,查询只是查询组件的轻DOM子项(模仿querySelector的行为),因此当使用本机视图封装时,nestedComponent为null.
你应该如何获得嵌套组件的DebugElement(以及组件实例)的引用?
假设我们有以下组件:@Component({ selector: 'my-nested-component', template: ` <h1>Nested component - {{ state }}</h1> `, }) export class NesterComponent { @Input() state: number; } @Component({ selector: 'my-app', template: ` <my-nested-component [state]="state"></my-nested-component> `, encapsulation: ViewEncapsulation.Native }) export class TestComponent { state = 1; }
所以我会写这样的测试:
let fixture = TestBed.createComponent(TestComponent); let component = fixture.componentInstance; const shadowRoot: DocumentFragment = fixture.debugElement.nativeElement.shadowRoot; const nestedComponentNativeElement = shadowRoot.querySelector('my-nested-component'); const nestedComponentDebugElement = <DebugElement>getDebugNode(nestedComponentNativeElement); var nestedComponentInstance: NesterComponent = nestedComponentDebugElement.componentInstance; // here can be your code component.state = 2; fixture.detectChanges(); de = nestedComponentDebugElement.query(By.css('h1')); expect(de.nativeElement.textContent).toBe('Nested component - 2');
你也可以尝试这个测试作为一个live example in plunker