当前位置: 首页 > 知识库问答 >
问题:

与RXJS catchError一起使用时,预期抛出实际上会崩溃

洪成济
2023-03-14
it('minimal test case', () => {
    expect(() => {
        of(1).pipe(
            map(() => {
                throw new Error('err');
            }),
            catchError(() => {
                throw new Error('new err');
            }),
        ).subscribe();
    }).toThrow();
});

这段代码实际上会崩溃Jasmine/Karma的整个执行,即使在原始的错误堆栈跟踪中也会导致错误内部的捕获错误

我认为如果可观察抛出并且无法处理它应该在它所在的上下文中传播该错误。否则,我无法测试可观察是否抛出。

此(茉莉花)测试将产生以下错误:

未捕获错误:CatchSubscriber.selector (slideshow.directive.spec.ts:224) 上的新错误 catchSubscriber.push.../../node_modules/rxjs/_esm5/internal/operators/catchError.js.CatchSubscriber.error (catchError.js:34) at MapSubscriber.push.../../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:38) at 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) at MapOperator.push.../../node_modules/rxjs/_esm5/internal/operators/map.js.MapOperator.call (map.js:18) at Observable.push.../../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:24) at CatchOperator.push.../../node_modules/rxjs/_esm5/internal/operators/catchError.js.CatchOperator.call (catchError.js:18)

TypeError:无法读取ContextKarma的directCallParentKarmaMethod(context.js:270)中未定义的属性“error”。handleGlobalErrors的错误(context.js:155)和KarmaReporter的错误(adapter.js:176)。suiteDone(adapter.js:224)在dispatch(jasmine.js:4560)在ReportDispatcher。suiteDone(jasmine.js:4531)位于nodeComplete(jasmine.js:1019)和onComplete处(JasmineJS:5528)位于ZoneDelegate…/../node_modules/zone.js/dist/zone/js.ZoneDeligate。在zone…/../node_modules/zone.js/dist/zone/js.zone处调用任务(zone.js:423)。runTask(zone.js:195)

预期函数将引发异常。在用户上下文中。(http://localhost:9876/src/app/shared/thumbnail/slideshow.directive.spec.ts?:227:6)在ZoneDelegate…/../node_modules/zone.js/dist/zone/js.zoneDelegte。调用(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。奥尼沃克(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.zoneDelegte。调用(http://localhost:9876/C:/Users/uzivatel/Documents/nubium/ulozto-web/angular/node_modules/zone.js/dist/zone/js?:390:1)

共有1个答案

司马弘益
2023-03-14

一种可能的解决方案是将错误重定向到成功路径,然后测试该值。当所测试的流具有连接到抛出不同错误类型的逻辑时,这可能很有用(尽管在这种情况下,对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);
      });
  });

但是一种更常见的方法是测试是否调用了正确的回调,正如JB Nizet所提到的。例如,您的服务有一个handleError方法,当流出错时应该调用该方法。

 类似资料:
  • 问题内容: 我正在为接下来的2个月内的OCPJP 8考试做准备,目前我受到了我的关注,因为我不明白为什么 这显然要编译OK!但是当您运行它时,您会看到这样的异常 我在这里需要一些帮助,以了解为什么asList方法不能与removeIf一起使用?我假设它将返回一个实现removeIf方法的ArrayList实例! 任何答案将不胜感激。 干杯! 问题答案: 生成一个列表,从该列表中无法删除元素,因此引

  • 我使用的Android MediaExtractor是这样的: 输入缓冲区由配置为AAC编码器的MediaCodec提供。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我一直跟踪到最后一行。 它也仅在将MediaExtractor与wav文件一起使用时发生。例如,我使用了一个。m4a,一切正常。 MediaExtractor的文档显示: MediaExtractor有助于从数据源中

  • 基本上,我想将格式为“hh:mm”的DateTimeFormatter应用于我从“zonedDateTime”获得的值。toLocalTime()'对象,并将其存储为LocalTime对象,这样我就可以获得像“08:00”这样的值。下面的代码显示了我如何获取特定时区的当前时间,我试图在格式化时将其转换为名为“currentTime”的LocalTime: 现在由于某种未知的原因,我从上面的最后一个

  • 在调用的返回类型中,的预期类型无法与实际类型匹配。可能的原因:应用于表达式:公式中中的参数太少: 在的第二个参数中,即表达式:中的中的与实际类型在方程中的无法匹配: 为什么不管用?我不能理解。请帮我一把。这些错误是可以理解的,但我不知道它们的原因。

  • 我使用的是Spring Boot 1.4.0。M3。 我有一个,它有一个,应该是唯一的: 使用Spring数据存储库,我想测试使用重复用户名时是否会出现异常。此测试工作: 但是,当使用添加时,此测试失败: 但是查看日志,会抛出: 2016-05-24 09:05:16.619错误22790---[主]o.h.发动机。jdbc。spi。SqlExceptionHelper:唯一索引或主键冲突:“UK