Этот вопрос является продолжением своего рода из предыдущего вопроса ( ссылка здесь ). Я все еще работаю с теми же файлами с целью написания простых учебных пособий для тестирования Angular. Новая проблема связана с функцией setTimeout.
И в ngOnInit, и в ngAfterViewInit я реализую setTimeout (другие тесты, которые я напишу в будущем, делают это, так что это просто для создания базового примера). Функция внутри устанавливает значение переменной, которая передается дочернему компоненту через файл HTML. Затем переменная этого дочернего компонента проверяется на конкретное значение.
Я уже пытался работать с tick (value) и fixture.detectChanges (), чтобы попытаться вызвать содержимое функции setTimeout, но значение все еще не определено (см. Фрагменты кода).
random.test.component.ts
public dataThatGetsDelayed: any;
constructor() {
}
ngOnInit() {
setTimeout(() => {
this.dataThatGetsDelayed = "OnInit";
}, 100);
}
ngAfterViewInit() {
setTimeout(() => {
this.dataThatGetsDelayed = "AfterView";
}, 100);
}
random.test.component.html
[variableThatStoresDelayedData]="dataThatGetsDelayed"
random.test.component.child.ts
@Input() variableThatStoresDelayedData: any;
random.test.file.spec.ts
it('Testing if receiving input works properly with a time delay in ngOnInit', fakeAsync(() => {
const componentInThePage: TestComponentChild = fixture.debugElement.query(By.directive(TestComponentChild)).componentInstance;
expect(componentInThePage).toBeTruthy();
tick(100);
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(componentInThePage.variableThatStoresDelayedData).toEqual("OnInit");
});
}));
it('Testing if receiving input works properly with a time delay in ngAfterViewInit', fakeAsync(() => {
const componentInThePage: TestComponentChild = fixture.debugElement.query(By.directive(TestComponentChild)).componentInstance;
expect(componentInThePage).toBeTruthy();
//tick(100);
//component.ngAfterViewInit();
fixture.whenStable().then(() => {
expect(componentInThePage.variableThatStoresDelayedData).toEqual("AfterView");
});
}));
Я читал, что должен был использовать whenStable в конце, но теперь я знаю, что это полностью пропущено. Без этого я получаю сообщение об ошибке «Ожидается, что неопределенное значение равно OnInit» / «AfterView». Я опустил второй тик, потому что он вызывает ошибку «1 таймер (ы) все еще в очереди».
Как сказать программе ждать, пока значение не будет установлено в функции setTimeout?