我在项目中同时具有属性和结构指令。我可以通过创建测试组件并在模板中使用属性指令来测试属性指令。
@Component({
template: `<input [myAttrDir]="{prop1: val1, prop2: val2}"/>`
})
export class TestComponent {
}
@Directive({
selector: '[myAttrDir]'
})
export class MyAttrDirective {
@Input('myAttrDir') testProp;
}
测试模块如下:
TestBed.configureTestingModule({
declarations: [MyAttrDirective, TestComponent]
})
我这样掌握指令:
fixture = TestBed.createComponent(TestComponent)
directive = fixture.debugElement.query(By.directive(MyAttrDirective))
我能够获取attribute指令的实例。 但是,当我尝试以相同的方式测试结构化指令时,会得到指令的空值。 我也检查了官方文档,仅发现attribute指令的单元测试。没有任何地方提供结构指令测试方法。
@Component({
template: `<input *myStrucDir="{prop1: val1, prop2: val2}"/>`
})
export class TestComponent {
}
@Directive({
selector: '[myStrucDir]'
})
export class MyStrucDirective {
@Input set myStrucDir(data);
constructor(
private templateRef: TemplateRef<any>,
private vcr: ViewContainerRef,
private cfr: ComponentFactoryResolver,
private el: ElementRef) {
}
}
TestBed.configureTestingModule({
declarations: [MyStrucDirective, TestComponent]
})
fixture = TestBed.createComponent(TestComponent)
directive = fixture.debugElement.query(By.directive(MyStrucDirective))
是否可以以任何方式测试结构指令?
答案 0 :(得分:2)
我遇到了同样的问题,但是我弄清楚了为什么debugElement.query(By.directive(MyStrucDirective))
不适用于结构化指令。
结构指令适用于模板(<ng-template>
)而不是元素。这意味着它们不绑定到任何DebugElement
,而是绑定到DebugNode
。差异很小,但是可以解释为什么找不到它。
要查找实例,您必须以其他方式查询:
# Angular 8.1 or below
debugElement.queryAllNodes(debugNode => debugNode.providerTokens.includes(MyStrucDirective))[0];
# Angular 8.2
debugElement.queryAllNodes(By.directive(MyStrucDirective))[0];