首页 > 解决方案 > 如何在 catchError 运算符中测试 throwError 返回的 observable?

问题描述

我有一个函数可以将运算符添加到命令调度返回的可观察对象中。我添加catchError了它将捕获的错误转换为我的错误类型之一。源 observable 在函数内订阅,对外不可见。功能工作正常,但我无法为此编写单元测试,因为函数内部的代码是异步的,但异步代码的执行在函数范围之外是不可见的。

doStuff() {
        commandService.dispatch( 'MyCommand', { data: data }).pipe(
            catchError( error => throwError( new MyError())),
            last(),
            tap( resultData => {
                processResultData( resultData );
            }),
        ).subscribe();
}

以下是我编写的单元测试。

it( 'should not call processResult if error', async done => {
            const error = { code: 1608, message: 'error', name: 'error' };
            spyOn( commandService, 'dispatch' ).and.returnValue( throwError( error ));
            spyOn(  myObject, 'processResult' ).and.returnValue( of({}));
            myObject.doStuff();
            expect(() => myObject.processResult ).not.toHaveBeenCalled();
        });

此测试失败,因为throwError内部抛出的错误catchError尚未处理。测试出现意外错误的投诉。我尝试了几种方法来捕获错误,但没有成功。有没有办法在不将 observable 暴露在函数之外的情况下捕获抛出的错误?

标签: javascriptrxjsjasmine

解决方案


尝试像这样更改您的 doStuff 函数:

doStuff() {
        commandService.dispatch( 'MyCommand', { data: data }).pipe(
            catchError( error => throwError( new MyError())),
            last(),
            tap( resultData => {
                processResultData( resultData );
            }),
         ).subscribe(success => {
           // ... what happens on success, keep it blank
       }, error => {
         // ... what happens on error, keep it blank
       });
}

我认为在 subscribe 块中添加该错误函数处理程序应该可以消除该错误(现在应该捕获该错误)。


推荐阅读