Ожидать, что броски на самом деле происходит сбой при использовании с RXJS catchError - PullRequest
0 голосов
/ 03 июля 2019
it('minimal test case', () => {
    expect(() => {
        of(1).pipe(
            map(() => {
                throw new Error('err');
            }),
            catchError(() => {
                throw new Error('new err');
            }),
        ).subscribe();
    }).toThrow();
});

Этот код фактически приведет к сбою всего выполнения Jasmine / Karma, даже в оригинальной трассировке стека Error, ведущей к Error внутри catchError.

Я думаю, что если наблюдаемые броски и не могут обработать их, следует распространять эту ошибку в контексте, в котором они находятся. В противном случае, я не могу проверить, наблюдаемые броски.

Этот (Жасмин) тест выдаст следующие ошибки:

Uncaught Error: new err в CatchSubscriber.selector (слайд-шоу.directive.spec.ts: 224) в CatchSubscriber.push ... / .. / node_modules / rxjs / _esm5 / internal / operator / catchError.js.CatchSubscriber.error (catchError.js: 34) в MapSubscriber.push ... / .. / node_modules / rxjs / _esm5 / internal / operator / map.js.MapSubscriber._next (map.js: 38) в MapSubscriber.push ... / .. / node_modules / rxjs / _esm5 / internal / Subscriber.js.Subscriber.next (Subscriber.js: 53) at Observable._subscribe (subscribeToArray.js: 5) at Observable.push ... / .. / node_modules / rxjs / _esm5 / internal / Observable.js.Observable._trySubscribe (Observable.js: 43) at Observable.push ... / .. / node_modules / rxjs / _esm5 / internal / Observable.js.Observable.subscribe (Observable.js: 29) в MapOperator.push ... / .. / node_modules / rxjs / _esm5 / internal / operator / map.js.MapOperator.call (map.js: 18) at Observable.push ... / .. / node_modules / rxjs / _esm5 / internal / Observable.js.Observable.subscribe (Observable.js: 24) в CatchOperator.push ... / .. / node_modules / rxjs / _esm5 / internal / operator / catchError.js.CatchOperator.call (catchError.js: 18)

TypeError: Невозможно прочитать свойство 'error' из неопределенного at directCallParentKarmaMethod (context.js: 270) at ContextKarma.error (context.js: 155) at handleGlobalErrors (adapter.js: 176) в KarmaReporter.suiteDone (adapter.js: 224) при отправке (jasmine.js: 4560) в ReportDispatcher.suiteDone (jasmine.js: 4531) в nodeComplete (jasmine.js: 1019) в onComplete (jasmine.js: 5528) в ZoneDelegate ... / .. / node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTask (zone.js: 423) в зоне ... / .. / node_modules / zone.js / dist / zone.js.Zone.runTask (zone.js: 195)

Ожидаемая функция для выдачи исключения. на UserContext. (http://localhost:9876/src/app/shared/thumbnail/slideshow.directive.spec.ts?:227:6) в ZoneDelegate ... / .. / node_modules / zone.js / dist / zone.js.ZoneDelegate.invoke (http://localhost:9876/C:/Users/uzivatel/Documents/nubium/ulozto-web/angular/node_modules/zone.js/dist/zone.js?:391:1) в ProxyZoneSpec.push ... / .. / node_modules / zone.js / dist / zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/C:/Users/uzivatel/Documents/nubium/ulozto-web/angular/node_modules/zone.js/dist/zone-testing.js?:289:1) в ZoneDelegate ... / .. / node_modules / zone.js / dist / zone.js.ZoneDelegate.invoke (http://localhost:9876/C:/Users/uzivatel/Documents/nubium/ulozto-web/angular/node_modules/zone.js/dist/zone.js?:390:1)

1 Ответ

1 голос
/ 03 июля 2019

Одним из возможных решений является перенаправление ошибки на путь успеха, а затем проверка этого значения. Это может быть полезно, когда в тестируемом потоке есть логика, связанная с выдачей разных типов ошибок (хотя в таком случае теста для instanceof Error, конечно, будет недостаточно).

  it('should be of type error', () => {
    of(1)
      .pipe(
        map(() => {
          throw new Error('err');
        }),
        catchError(error => of(error)))
      .subscribe(result => {
        expect(result instanceof Error).toBe(true);
      });
  });

Но более распространенный подход afaik - проверить, был ли вызван правильный обратный вызов, как упоминал JB Nizet. Например. у вашей службы есть метод handleError, который следует вызывать при ошибке потока.

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