Тестирование наблюдаемого интервала в ngOnInit - PullRequest
4 голосов
/ 29 февраля 2020

Я пытался запустить этот тест более суток, и у меня нет вариантов.

Я пытался использовать варианты fakeAsync и вводить testScheduler, но функция tick(), кажется, не имеет никакого эффекта, и, как я опишу, введение testScheduler работает слишком хорошо.

Функция, которую я протестирую sh, такова:

ngOnInit() {
  ...
  interval(environment.verificationCheckPollingInterval).pipe(takeUntil(this.destroy)).subscribe(_ =>
    this.store.dispatch(fromAccount.checkEmailVerificationStatus()));
}

Я понимаю, что опрос для проверки электронной почты не идеальная практика, но это история для другого дня.

Моя функция тестирования жасмина выглядит следующим образом:

describe('After the verification interval has elapsed', () => {
  it('should dispatch a check verification email action after the verification interval has elapsed', fakeAsync(() => {
    tick(environment. environment.verificationCheckPollingInterval);
    fixture.detectChanges();
    testScheduler.run(({ expectObservable, flush, cold }) => {
      expectObservable(store.scannedActions$.pipe(
        ofType(fromAccount.ActionTypes.checkEmailVerificationStatus),
        map((_) => true))).toBe('a', { a: true });
    });
  }));
});

Кажется, что функция tick вообще ничего не делает.

Другой подход - ввести scheduler в компонент и изменить подписку на

interval(environment.verificationCheckPollingInterval, this.scheduler).pipe(takeUntil(this.destroy)).subscribe(_ =>
    this.store.dispatch(fromAccount.checkEmailVerificationStatus()));

, а затем в моем настройка теста, включающая

{ provide: Scheduler, useValue: testScheduler }

Но это работает слишком хорошо (кроме того факта, что я буду модифицировать производственный код для поддержки тестов, что далеко от идеала). Причина, по которой он работает слишком хорошо, состоит в том, что, если я ставлю точку останова на обработчик подписки, он вызывается повторно без каких-либо задержек, и на каждом шаге значение testScheduler.frame увеличивается на 1000 кадров (мой интервал опроса составляет 1 секунду ). Это приводит к зависанию моего браузера и вызывает некоторый тревожный нагрев ноутбука.

Я что-то упустил? Есть ли способ проверить interval без поджога моего ноутбука?

ОБНОВЛЕНИЕ

У меня было одно очень разумное предложение, которое, к сожалению, не удалось.

Учитывая этот код:

describe('After the verification interval has elapsed', () => {
  it('should dispatch a check verification email action after the verification interval has elapsed', (done) => {
    store.scannedActions$.pipe(
      ofType(fromAccount.ActionTypes.checkEmailVerificationStatus),
      take(1)).subscribe(x => {
        console.log('action dispatched', x);
        done();
    });
  });
});

вызов console.log вызывается, но тест завершается неудачно с сообщением

Ошибка: Тайм-аут - Asyn c обратный вызов был не вызывается в течение 5000 мс (устанавливается jasmine.DEFAULT_TIMEOUT_INTERVAL)

1 Ответ

1 голос
/ 29 февраля 2020

Вы можете просто подписаться на store и позвонить done, когда закончите тесты.

Для получения дополнительной информации вы можете прочитать ее здесь

describe('After the verification interval has elapsed', () => {
  it('should dispatch a check verification email action after the verification interval has elapsed', (done) => {
      store.scannedActions$.pipe(
        ofType(fromAccount.ActionTypes.checkEmailVerificationStatus))
        .subscribe(_ => {
            // run your tests here
            done();
        });
  });
});
...