【问题标题】:testing a polling service测试轮询服务
【发布时间】:2018-06-26 18:11:11
【问题描述】:

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

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

}

我该如何测试这段代码?我认为带有 tick() 的 fakeAsync 块足以触发 observable,但 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

【问题讨论】:

  • 调用 fakeAsync() 和 tick() 不会做什么?
  • 它对调度程序进行了修补,以便 RxJS 使用与 zone.js 相同的假时间概念。基本上,它只是让 RxJS 与 fakeAsync 配合得很好 - 它在内部调用。

标签: angular unit-testing rxjs


【解决方案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 文件即可。

【讨论】:

  • 感谢您的补充说明。不幸的是,现在我得到“TypeError: Cannot convert undefined or null to object”,我不知道它是从哪里来的。
  • 你使用的是什么版本的 Angular 和 RxJS?
  • Angular 5.2.11 和 RxJS 5.5.11
  • fakeSchedulers 仅存在于支持 RxJS 版本 6 的 rxjs-marbles 版本中。但是,还有另一种选择:使用 zone.js 修补调度程序。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2015-04-08
  • 2013-11-11
  • 1970-01-01
  • 2021-12-29
  • 2013-05-25
  • 1970-01-01
相关资源
最近更新 更多