RXjs使用jasmine进行6次回调测试

问题描述 投票:1回答:1

这是一个简单的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。

rxjs karma-jasmine jasmine2.0 rxjs6 rxjs-pipeable-operators
1个回答
0
投票

我一直在努力解决同样的问题。在我的情况下,我试图在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的返回值,并设置检查测试所需的期望。

© www.soinside.com 2019 - 2024. All rights reserved.