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

Скажем, у меня есть угловой Компонент, который определяет Наблюдаемую 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.

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

1 Ответ

0 голосов
/ 30 января 2019

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

Пример кода

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

    skip(1000);

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

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

...