angular - 在我的测试 stub 中强制使用 rxjs 发生错误

标签 angular unit-testing rxjs

我的服务看起来像这样

public getData(): Observable<Data> {
    return this.http
        .get<Data>(url)
        .pipe(
            tap(res => res),
            (e: any) => e);
}

我无法使用 catchError 运算符 ( Handling error with rxjs not compatible with interceptors )

在我订阅它的组件中,它会在必要时抛出错误

this.service.getData().subscribe(res => {
  myProp = true;
}, (error) => {
  if (error.errorMessage === 'xxx') {
    myProp = false;
  }
});

为了测试这一点,我创建了一个 stub (用于与 catchError 一起使用)

export class ServiceStub {
    public getData(): Observable<Data> {
        return of({errorMessage: 'some error'});
    }
}

此代码在订阅内部作为“res”返回,但不在订阅的错误回调中返回。

我尝试抛出新的错误('some error'),但我需要返回一个对象。

我也尝试过 throw({errorMessage: 'some error'}) 但测试失败并显示

[object Object] thrown

最佳答案

您可以使用throwError运算符。欲了解更多信息,请查看docs

将您的 stub 更改为此

import { throwError } from 'rxjs';

export class ServiceStub {
    public getData(): Observable<Data> {
        return throwError({errorMessage: 'some error'});
    }
}

或者您可以使用Observable构造函数,如下所示

getData() {
  return new Observable(observer => {
    observer.error({errorMessage: 'some error'});
  });
}

关于angular - 在我的测试 stub 中强制使用 rxjs 发生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55156638/

相关文章:

Angular 4 : Using HTTP interceptor + RxJS timeout operator error

javascript - 过滤窗口上的事件与 DOM 节点上的单个事件

javascript - typescript 在函数中传递变量

angular - 执行 "ng serve"或 "npm start"命令浏览器未自动打开

angular - 使用动态对象数据在 Angular 模板中显示对象数据

php - 我如何覆盖 php ://input when doing unit tests

typescript - 单例服务的 Angular 单元测试

unit-testing - 带有 IStringLocalizer 的 asp.net 核心测试 Controller

rxjs - 如何从最后一项开始以相反的方向从数组中发出值?

angular - 使用元数据在 angular2 中创建动态表单