【发布时间】: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