这是一个简单的post函数,我可以在jasmine中单元测试成功和catchError。是否有可能在jasmine中测试finalize(我们可以期望在finalize中,loader已经关闭了吗?
post(url,requestData){
this.http.post(url, requestData).pipe(
response => this.Response(response),
catchError((error: Response) => this.Error(error, msg)),
finalize(() => {
loader.close();
})
}
在finalize中,我正在关闭加载器,我需要单元测试关闭加载器以调用finalize。
我一直在努力解决同样的问题。在我的情况下,我试图在Angular中测试拦截器。
我的解决方案是通过一个真正的Observable作为模拟。
这是我的实际代码:
@Injectable()
export class SetLoadingService implements HttpInterceptor {
constructor(@Inject('INotificationLoading') private _INotificationLoading: INotificationLoading) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.headers.has('HideLoading')) {
return next.handle(req);
} else {
this._INotificationLoading.openLoading();
return next.handle(req).pipe(finalize(() => {
this._INotificationLoading.closeLoading();
}));
}
}
}
这是我的考验:
it('should be show loading', () => {
const next: any = {
handle: () => {
return Observable.create(subscriber => {
subscriber.complete();
});
}
};
const requestMock = new HttpRequest('GET', '/test');
const closeLoadingSpy = spyOn<INotificationLoading>(notification, 'closeLoading');
service.intercept(requestMock, next).subscribe(() => {
expect(closeLoadingSpy).toHaveBeenCalled();
});
expect(openLoadingSpy).toHaveBeenCalled();
});
简而言之,我解决了传递Observable.create()作为方法句柄返回的问题。在您的情况下,您可以设置http mock和Observable的返回值,并设置检查测试所需的期望。