rxjs:如何正确测试mergeMap中的throwError情况

时间:2019-09-06 09:29:31

标签: rxjs jasmine-marbles

考虑以下代码示例

  refreshToken(): Observable<object> {
    return this.userService.getUser()
      .pipe(
        mergeMap((user) => this.http.post(
            'url', { data: user.id  }
          ).pipe(catchError(this.handleError))
        ),
        tap(...),
        mergeMap(...)
      );
    }

    private handleError = (error: any) => {
      this.window.location.href = '/logout';
      return throwError(new Error('Failed to refresh'));
    }

我要完成以下行为-如果post失败,则将用户重定向到登录页面并中止当前可观察到的情况。

现在我要测试

  const userObservable = hot('-u|', { u: user });
  const tokenObservable = hot('--#', null, new Error('test'));

  userMock.getUser.and.returnValues(userObservable);
  httpMock.post.and.returnValue(tokenObservable);

  expect(service.refreshToken()).toBeObservable(cold('--(c|)', {c: new Error('Failed to refresh')}));

但是我无法理解原理,如何为这种情况正确编写测试?

0 个答案:

没有答案