Неожиданная ошибка при тесте жасмина (с наблюдаемым) - PullRequest
0 голосов
/ 10 марта 2020

Я написал тест для следующего метода:

  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.

Я прочитал документацию Rx JS и нашел проблему, но не смог выяснить, что мне нужно сделать, чтобы пройти тест. Любая помощь, чтобы указать, где я сделал ошибку, будет высоко оценена.

1 Ответ

0 голосов
/ 10 марта 2020

Я нашел проблему; был другой подписчик на segmentationStatus, который не обрабатывал ошибку. Поскольку никто не «поймал в ловушку» исключение, оно всплыло и было переброшено. Как объяснено в Субъекте Предметов (в Rx JS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...