Имеется этот Angular компонент:
import { Component, OnDestroy, OnInit } from '@angular/core';
import { asyncScheduler, Observable, of, queueScheduler, scheduled } from 'rxjs';
@Component({
selector: 'test-component',
templateUrl: './test-component.component.html'
})
export class TestComponentComponent implements OnInit {
value: string;
constructor() { }
ngOnInit(): void {
const data$ = this.fetchDataScheduler();
data$
.subscribe(value => {
this.value = value;
});
}
private fetchDataScheduler(): Observable<string> {
return scheduled(of('foo'), asyncScheduler);
}
}
и тест не пройден:
it('async - test setTimeout', fakeAsync(() => {
expect(component.value).toBeFalsy();
fixture.detectChanges(); // ngOnInit
expect(component.value).toBeFalsy();
flush();
expect(component.value).toBe('foo'); // <- fails here
}));
flush()
следует за гриппом sh все макрозадачи, но это не так. Почему? Если я использую tick()
, то тест проходит успешно.
(скриншоты выше предоставлены плагином Jest and Wallaby.)
Почему не проходит с flush()
, но проходит с tick()
?
flu sh:
Имитирует асинхронное прохождение времени для таймеры в зоне fakeAsyn c путем опустошения очереди макросов до тех пор, пока она не станет пустой. Возвращаемое значение - это миллисекунды времени, которые прошли бы.
Репо здесь: https://stackblitz.com/github/felikf/angular-testing-examples