Как проверить, что Observable не излучает в Angular Component, который содержит асинхронную логику

Допустим, у меня есть угловой компонент, который определяет наблюдаемый myObs$ как одно из его свойств.

В одном тесте, при определенных условиях, я хочу проверить, что myObs не уведомляет. В логике присутствуют некоторые задержки, поэтому тест должен быть асинхронным.

Я использую Жасмин.

До сих пор я смог выработать это решение

it('asynch test', done => {
    let dataEmitted;
    myObs$
    .pipe(
      tap(data => dataEmitted = data),
    )
    .subscribe();
    setTimeout(() => {
      if (dataEmitted) {
        done.fail('should not emit ');
      } else {
        done();
      }
    }, 1000);
  });

но я далек от этого. Я должен положиться на setTimeout выполнить проверки и позвонить в done функция.

Любое предложение о том, как правильно выполнить такой тест? Синхронные решения не работают, поскольку в логике присутствует внутренняя асинхронность.

2 ответа

Если это асинхронная логика, основанная на setTimeout / debounceTime и т. Д., Вы можете использовать функцию fakeAsync() для ее проверки, эта функция заменит все эти асинхронные операции синхронными, поэтому можно будет проверить вашу логику, поскольку она синхронная. Также вы можете использовать skip(), чтобы пропустить витки виртуальной машины (и это также происходит синхронно!). С помощью этого решения у вас будут красивые и чистые, быстрые и надежные юнит-тесты

Пример кода

it('asynch test', fakeAsync(() => {
    let dataEmitted;
    myObs$.subscribe(data => dataEmitted = data);

    skip(1000);

    expect(dataEmitted).toBeUndefined();
}));

Я также предлагаю вам проверить негативный сценарий, например, skip(2000) и проверить, имеет ли он значение. Надеюсь, это поможет.

Предполагая, что Observable в конце концов завершается, это также можно сделать с помощью обычного itфункция с использованием done():

      it(
  'async test',
  (done: DoneFn) => {
    let emitted = false;
    myObs$
    .subscribe({
      next: () => emitted = true;
      complete: () => {
        expect(emitted).toBeFalse();
        done();
      }
    });
  }
);
Другие вопросы по тегам