Angular тест с помощью asyncScheduler и flu sh - почему он не работает с flu sh ()? - PullRequest
4 голосов
/ 08 января 2020

Имеется этот 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
  }));

failing test

flush() следует за гриппом sh все макрозадачи, но это не так. Почему? Если я использую tick(), то тест проходит успешно.

passing test

(скриншоты выше предоставлены плагином Jest and Wallaby.)

Почему не проходит с flush(), но проходит с tick()?

flu sh:

Имитирует асинхронное прохождение времени для таймеры в зоне fakeAsyn c путем опустошения очереди макросов до тех пор, пока она не станет пустой. Возвращаемое значение - это миллисекунды времени, которые прошли бы.

Репо здесь: https://stackblitz.com/github/felikf/angular-testing-examples

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...