Как отловить исключение, выброшенное из наблюдаемой подписки в тесте - PullRequest
0 голосов
/ 20 сентября 2018

Я не уверен, как обрабатывать исключения с параметрами URL в Angular 6. Сейчас моя служба выдает Error, когда идентификатор URL не может быть найден.В реальном приложении мне нравится, что ошибка всплывает, чтобы ее можно было поймать и зарегистрировать, но в моих тестах с жасмином это приводит к неудаче теста:

HeroDetailComponent should navigate to not found page
[object ErrorEvent] thrown

Я пробовал различные блоки try {} catch () {} и catchError конвейеры для обработки ошибки в жасмине, но, кажется, ничто не может перехватить эту ошибку после ожидаемого выполнения теста.

Демонстрация проблемы: https://angular -observable-catch.stackblitz.io/

Обратите внимание, что при работе со стекаблицем тест не дает сбоя, но он выполняется локально при запуске в моем приложении с использованием ng test.

. В (главной) консоли обратите внимание на ошибку:

Uncaught Error: Hero 999 not found.
    at HeroService.getHeroById (hero.service.ts:33)
    at SwitchMapSubscriber.eval [as project] (hero-detail.component.ts:46)
    at SwitchMapSubscriber._next (switchMap.ts:103)
    at SwitchMapSubscriber.Subscriber.next (Subscriber.ts:104)
    at ReplaySubject.Subject.next (Subject.ts:62)
    at ReplaySubject.nextInfiniteTimeWindow (ReplaySubject.ts:42)
    at ActivatedRouteStub.setParamMap (activated-route-stub.ts:56)
    at UserContext.eval (hero-detail.component.spec.ts:65)
    at ZoneDelegate.invoke (zone.js:388)
    at ProxyZoneSpec.onInvoke (zone-testing.js:288)

Исходный код для демонстрации: https://stackblitz.com/edit/angular-observable-catch?file=src%2Fapp%2Fhero%2Fhero-detail.component.spec.ts

Как отловить эту ошибку в моих тестах с жасмином, чтобы она не вызвала Uncaught Error?


Обновление

Я выяснил, что это вызвано подпиской AsyncPipe , которая выдает любые ошибки Наблюдаемые / Обещания / и т.д.

1 Ответ

0 голосов
/ 04 декабря 2018

Обход, который я нашел для этой проблемы, состоит в замене AsyncPipe в TestBed на тот, который не будет выдавать ошибки.

test-async-pipe.ts:

import { AsyncPipe } from '@angular/common';
import { Pipe } from '@angular/core';

/**
 * When the AsyncPipe throws errors Jasmine cannot catch them and causes tests to fail.
 * For tests just log the error and move on.
 * Add this class to the TestBed.configureTestingModule declarations.
 */
@Pipe({name: 'async', pure: false}) // tslint:disable-line:use-pipe-transform-interface
export class TestAsyncPipe extends AsyncPipe {
  transform(obj: any): any {
    const ret = super.transform(obj);
    const handleError = (err: any) => { console.error('AsyncPipe Template Exception', err); };
    // @ts-ignore: patch the Observable error handler to not throw an error in tests.
    this._subscription.destination._error = handleError;
    // What if the subscription is a Promise?
    return ret;
  }
}

a-test.spec.ts

import { async, TestBed } from '@angular/core/testing';

import { TestAsyncPipe } from '../testing/test-async-pipe';

import { TestComponent} from './test.component';

describe('TestComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ TestAsyncPipe, TestComponent],
    })
    .compileComponents();
  }));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...