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

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

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

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

Пока мне удалось создать это решение:

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

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

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


person Picci    schedule 30.01.2019    source источник


Ответы (1)


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

Пример кода

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

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

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

person Amir Arbabian    schedule 30.01.2019
comment
Крутой! Благодарность! оператор skip довольно наворочен! Мне интересно, взаимозаменяем ли он с tick, который идет вместе с fakeAsync - person Royalsmed; 29.03.2021
comment
Вы правы, я имел ввиду tick, а написал _2 _... Отредактирую ответ - person Amir Arbabian; 01.04.2021