Тестирование службы опроса

У меня есть служба angular, задача которой - опрашивать API каждые 60 секунд, чтобы проверить, подключен ли клиент по-прежнему:

export class AppService {

  get isOnline$(): Observable<{ online: boolean }> {
    return this.isOnlineSource.asObservable();
  }
  private isOnlineSource = new BehaviorSubject<{ online: boolean }>({ online: true });

  constructor(private http: HttpClient) {
    timer(0, 60000).switchMap(() =>
      this.http.get(`${environment.apiUrl}/api/assessments/amionline`, environment.httpOptions)
        .map(x => {
          return { online: true };
        })
        .catch((err, caught) => {
          return of({ online: false });
        })
    ).
      subscribe(data => this.isOnlineSource.next(data));
  }

}

Как мне протестировать этот код? Я думал, что блока fakeAsync с тиком () будет достаточно для запуска наблюдаемого, но httpMock не получает запросов

Код теста:

 it('should return online equals false.', fakeAsync(() => {
   appService.isOnline$.subscribe(data => {
    expect(data.online).toEqual(false);
   });
   tick(70000);
   httpMock.expectOne(url).flush(undefined, mockErrorResponse);
   httpMock.verify();
  }));
 });

Примечание: в тесте используется HttpClientTestingModule, а httpMock - HttpTestingController.

Взгляните на github.com/cartant/rxjs-marbles/blob/master/…

cartant 26.06.2018 22:51

Что это значит, что вызов fakeAsync () и tick () - нет?

Charlie Elverson 26.06.2018 23:56

Он исправляет планировщики, так что RxJS использует ту же концепцию фиктивного времени, что и zone.js. По сути, это просто заставляет RxJS хорошо работать с fakeAsync, который он вызывает внутри себя.

cartant 26.06.2018 23:59
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
1 062
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, мешающая вашему тесту работать, решена в этот пиар, который недавно был объединен.

fakeAsync Angular исправляет функции, связанные со временем, такие как setTimeout, а также исправляет класс Date, в частности, исправляет Date.now. К сожалению, до того, как PR был объединен, RxJS использовал ссылку на Date.now, прежде чем он мог быть исправлен с помощью fakeAsync.

Это означает, что ваш тест будет работать, когда будет опубликован следующий выпуск RxJS.

До тех пор вы могли либо использовать функцию fakeSchedulers в моем пакете rxjs-marbles, либо использовать аналогичную технику для исправления метода now планировщика. (Угловая реализация fakeSchedulers прост.)

Если вы используете RxJS версии 5, есть альтернатива: вы можете импортировать zone-patch-rxjs-fake-async.js и указать zone.js для исправления планировщиков. Просто добавьте import 'zone.js/dist/zone-patch-rxjs-fake-async' в ваш файл src/test.ts.

Спасибо за добавленное объяснение. К сожалению, теперь я получаю «TypeError: Невозможно преобразовать undefined или null в объект», и я не могу понять, откуда это взялось.

Charlie Elverson 28.06.2018 20:02

Какие версии Angular и RxJS вы используете?

cartant 28.06.2018 20:21

Угловой 5.2.11 и RxJS 5.5.11

Charlie Elverson 28.06.2018 22:30
fakeSchedulers существует только в версии rxjs-marbles, которая поддерживает RxJS версии 6. Однако есть альтернатива: исправить планировщики с помощью zone.js. Я обновил ответ.
cartant 28.06.2018 23:05

Другие вопросы по теме