yoo*_*ung 4 unit-testing jasmine viewchild angular
如何存根/模拟读取为 的指令/组件ViewChild?
例如,使用 angular.io 中的简单指令:
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
假设我正在测试并将使用AppComponent读取为:HighlightDirectiveViewChild
@ViewChild(HighlightDirective) theHighlightDirective: HighlightDirective
Run Code Online (Sandbox Code Playgroud)
存根指令是:
@Directive({
selector: '[appHighlight]'
})
export class StubbedHighlightDirective {
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
由于组件正在尝试读取,即使您在单元测试中HighlightDirective声明,也将是。StubbedHighlightDirectivetheHighlightDirectiveundefined
例子:
it('HighlightDirective is defined', () => {
// This test fails
expect(component.theHighlightDirective).toBeDefined();
});
Run Code Online (Sandbox Code Playgroud)
如果您忽略 tslint 中的某些内容或使用as关键字,则可以解决此问题:
Version 1: Just ignore some things in tslint so compiler doesn't complain
it('HighlightDirective is defined', () => {
// Compiler will typically complain saying that
// StubbedHighlightDirective isn't assignable to type of HighlightDirective
component.theHighlightDirective = new StubbedHighlightDirective();
// this passes
expect(component.theHighlightDirective).toBeDefined();
});
Version 2: Use "as" keyword
it('HighlightDirective is defined', () => {
// Actually compiler will still complain with warnings
component.theHighlightDirective = new StubbedHighlightDirective() as HighlightDirective;
// this passes
expect(component.theHighlightDirective).toBeDefined();
});
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法可以干净地消除这些类型的 ViewChild 引用?
小智 5
问题是您正在使用一个类来查找孩子,并且该类已被您的存根替换。exportAs您可以在指令(文档、博客文章)中使用匹配的链接来确保真实版本和存根具有相同的名称。
在原始指令装饰器中:
@Directive({
selector: '[appHighlight]',
exportAs: 'appHighlight'
})
export class HighlightDirective {
Run Code Online (Sandbox Code Playgroud)
在存根指令中:
@Directive({
selector: '[appHighlight]',
exportAs: 'appHighlight'
})
export class StubbedHighlightDirective {
Run Code Online (Sandbox Code Playgroud)
然后在使用该指令的模板中:
<div appHighlight #appHighlight="appHighlight">
Run Code Online (Sandbox Code Playgroud)
完成所有这些后,您需要更新@ViewChild定义以使用字符串而不是类:
@ViewChild('appHighlight') theHighlightDirective: HighlightDirective
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2505 次 |
| 最近记录: |