我一直在努力解决同样的问题。就我而言,我试图在 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 并设置检查测试所需的期望。