测试投票服务

时间:2018-06-26 18:11:12

标签: angular unit-testing rxjs

我有一个角度服务,其工作是每60秒轮询一次API以验证客户端是否仍然连接:

" ".join([str(i) for i in range(0, 7)])

如何测试此代码?我以为带有tick()的fakeAsync块足以触发可观察到的东西,但是httpMock没有收到请求

测试代码:

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));
  }

}

注意:测试使用的是HttpClientTestingModule,而httpMock是HttpTestingController

1 个答案:

答案 0 :(得分:1)

this PR中已解决了导致测试无法正常工作的问题-该问题最近已合并。

Angular的fakeAsync修补与时间相关的功能-例如setTimeout-并且还修补Date类-特别是修补Date.now。不幸的是,在PR合并之前,RxJS在Date.now对其进行修补之前先引用了fakeAsync

这意味着您的测试将在下一版RxJS发布时起作用。

在此之前,您可以在我的rxjs-marbles软件包中使用fakeSchedulers函数,也可以使用类似的技术来修补调度程序的now方法。 (Angular-specific implementation of fakeSchedulers很简单。)

如果您使用的是RxJS版本5,则有另一种选择:您可以导入zone-patch-rxjs-fake-async.js并让调度程序对zone.js进行修补。只需将import 'zone.js/dist/zone-patch-rxjs-fake-async'添加到您的src/test.ts文件中即可。