我有一个角度服务,其工作是每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
答案 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
文件中即可。