Как вам заглушить / смоделировать директиву / компонент, который читается как ViewChild?
Например, используя простую директиву от angular.io:
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
constructor() { }
}
Допустим, чтоЯ тестирую AppComponent
и считываю HighlightDirective
, используя ViewChild
как:
@ViewChild(HighlightDirective) theHighlightDirective: HighlightDirective
И директива-заглушка:
@Directive({
selector: '[appHighlight]'
})
export class StubbedHighlightDirective {
constructor() { }
}
Посколькукомпонент пытается прочитать HighlightDirective
, даже если вы объявите StubbedHighlightDirective
в своих модульных тестах, theHighlightDirective
будет неопределенным.
Пример:
it('HighlightDirective is defined', () => {
// This test fails
expect(component.theHighlightDirective).toBeDefined();
});
Вы можете обойти этоесли вы игнорируете некоторые вещи в 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();
});
Есть ли другой способ чистого удаления этих видов ссылок ViewChild?