代码之家  ›  专栏  ›  技术社区  ›  Charlie Elverson

测试轮询服务

  •  1
  • Charlie Elverson  · 技术社区  · 8 年前

    我有一个Angular服务,其任务是每隔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));
      }
    
    }
    

    如何测试此代码?我认为fakeasync块加上tick()就足以触发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

    1 回复  |  直到 8 年前
        1
  •  1
  •   cartant    8 年前

    阻止测试工作的问题已在中解决。 this PR -最近被合并了。

    角的 fakeAsync 补丁时间相关功能-如 setTimeout -它还可以修补 Date 类-尤其是IT补丁 Date.now .不幸的是,在合并PR之前,RXJS引用了 日期:现在 在它被修补之前 传真同步 .

    这意味着您的测试将在RXJS的下一个版本发布时工作。

    在此之前,您可以使用 fakeSchedulers 在我的 rxjs-marbles 或者可以使用类似的技术来修补调度程序的 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 文件。