тестирование службы голосования - PullRequest
0 голосов
/ 26 июня 2018

У меня есть служба 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

1 Ответ

0 голосов
/ 27 июня 2018

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

Angular fakeAsync исправляет связанные со временем функции - например, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...