Существует этот компонент 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()
должен сбросить все макрозадачи, но это не так. Почему? Если я использую tick()
, то тест проходит.
(Скриншоты выше предоставлены плагином Jest и Wallaby.)
Почему не проходит с flush()
, а проходит с tick()
?
Имитирует асинхронный ход времени для таймеров в зоне fakeAsync, очищая очередь макрозадач до тех пор, пока она не станет пустой. Возвращаемое значение — это миллисекунды времени, которое должно было пройти.
Репо находится здесь: https://stackblitz.com/github/felikf/angular-testing-examples
tick()
без аргументов является командойflush()
. angular.io/guide/testing#component-with-async-service - person Athanasios Kataras   schedule 08.01.2020