Мы используем Scheduler
s из Rxjs.
Класс выглядит примерно так:
import { Observable, Scheduler, Subject, asapScheduler } from 'rxjs';
// ...
constructor(
@Optional() private readonly _scheduler: Scheduler
) {
if (isNullOrUndefined(_scheduler)) {
this._scheduler = asapScheduler;
}
}
// ...
this._someObservable.pipe(delay(1, this._scheduler));
Затем в спецификации файла, обеспечивающего макет в TestModuleMetadata
:
{
declarations: [YourComponent],
imports: [],
providers: [
{ provide: Scheduler, useValue: new VirtualTimeScheduler() },
],
};
Теперь все, что вам нужно сделать, это назначить планировщик в блоке beforeEach
и сбросить его всякий раз, когда вы хотите, чтобы задержка была "пропущена":
let schedulerMock = Testbed.get(Scheduler);
// ...
it('should emit true', () => {
let result: boolean = null;
comp.someObservable.subscribe(next => (result = next));
schedulerMock.flush();
expect(result).toBe(true);
});
Это такжеработает с другими зависящими от времени операторами, такими как bufferTime
.Какой планировщик вы хотите или должны использовать в компоненте, должен соответствовать вашему сценарию использования, в лучшем случае посмотрите документацию и выясните, что вам больше подходит.