Как проверить наблюдаемое, возвращаемое throwError в операторе catchError? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть функция, которая добавляет операторы к наблюдаемому, возвращаемому диспетчером команд. Я добавил catchError, который преобразует обнаруженную ошибку в один из моих типов ошибок. Наблюдаемый источник подписывается внутри функции и не виден снаружи. Функциональность работает нормально, но у меня возникли проблемы с написанием модульных тестов для этого, поскольку код внутри функции является asyn c, но выполнение кода asyn c не видно за пределами области действия функции.

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, не была обработана. Жалобы на то, что произошла непредвиденная ошибка. Я пробовал несколько способов отловить ошибку, но безуспешно. Есть ли способ поймать возникшую ошибку, не подвергая наблюдаемое извне функции?

1 Ответ

0 голосов
/ 19 июня 2020

Попробуйте изменить функцию 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
       });
}

Я думаю, добавление этого обработчика функции ошибки в блок подписки должно избавить от этой ошибки (теперь ошибка должна быть обнаружена).

...