首页 > 解决方案 > 茉莉花测试期间出现意外错误(可观察到)

问题描述

我为以下方法编写了一个测试:

  private _segmentationStatus$: Subject<string> = new Subject();
  public readonly segmentationStatus: Observable<string> = this._segmentationStatus$.asObservable();

  /**
   * Get the status from the segmentation service.
   */
  public getStatus() {
    const segmentationId: string = this._segmentationIdService.segmentationId;
    const segmentationStatusUrl = `${this.getSegmentationStatusUrl}/${segmentationId}/status`;
    this._http
      .get(segmentationStatusUrl, { responseType: 'text' })
      .subscribe({
        next: () => {
          this._loggerService.trackTrace(`Segmentation status: ${status}`, LogSeverity.Verbose);
          this._segmentationStatus$.next(status);
        },
        error: (error) => {
          this._messageService.emitMessage(new Message(MessageCode.ErrorGetStatus, error));
          this._loggerService.trackException(error);
          this._segmentationStatus$.error(error);
        }
      });
  }

为了测试我开始编写测试的方法,如下所示:

    fit('should emit a message if the request failed', done => {
      let messageReceived: Message;
      spyOn((service as any)._messageService, 'emitMessage').and.callFake(message => {
        messageReceived = message;
      });
      service.segmentationStatus.subscribe({
        error: () => {
          expect(messageReceived.messageCode).toBe(MessageCode.ErrorGetStatus);
          done();
        }
      });
      spyOnProperty(
        (service as any)._segmentationIdService,
        'segmentationId',
        'get'
      ).and.returnValue('id');

      service.getStatus();

      httpTestingController
        .expectOne(`${service.getSegmentationStatusUrl}/id/status`)
        .flush('{}', { status: 500, statusText: 'status' });
    });

如果我使用调试器,程序和测试的流程是符合预期的。我看到发出的消息,并且调用了单元测试中的错误处理程序。但是,在单元测试中的错误处理程序完成this._segmentationStatus$.error(error);生产代码中的行后,会引发另一个错误,该错误未得到处理。因此,测试失败并显示消息Uncaught [object Object] thrown

我已经阅读了 RxJS 文档并搜索了问题,但无法弄清楚我需要做什么才能通过测试。任何帮助指出我在哪里犯了错误将不胜感激。

标签: rxjsjasmine

解决方案


我发现了问题;有另一个未处理错误的 segmentationStatus 订阅者。由于没有人“捕获”异常,因此它冒泡并被重新抛出。正如在主题主题(在 RxJS 中)中所解释的那样。


推荐阅读