ngrx-effects - ngrx/effects - 如何使用 Promise 进行测试

标签 ngrx-effects

我正在使用 ngrx/effects 进行弹珠测试。我有一项使用 promise 的服务。我希望我的效果能够调用服务并处理成功和错误状态。我有这样的代码

效果: .mergeMap(() => this.service.getThings() .map((事物) => 新的 SetThingsAction(事物)) .catch((错误)=> of(new HandleAPIErrorAction(错误)) ) ) .catch((错误)=> of(new HandleAPIErrorAction(错误)) );

服务: 公共(public)geThings(){ return Observable.fromPromise(this.promiseBasedThing.getTheThings()); }

然后进行测试: actions = hot("a", { a: new GetThingsAction() }); const 响应 = 冷("-#", {}); service.getThings.and.returnValue( 响应 ); const Expected = Cold("-b", { b: new HandleAPIErrorAction("error") }); 期望(effects.getThings$).toBeObservable(预期);

这实际上一切正常。然而,效果中的双重捕获似乎显然很糟糕,并且可能表明我不明白 Observables 是如何工作的。在现实世界中,只有后面的捕获才是有效的。经过测试,第一个是有效的。

基于this看起来 Promise 不适用于弹珠测试。 This SO question给出了错误处理的想法,但似乎无法测试,因为它有一个 Promise。

如何使用 ngrx/effects 进行错误处理、 promise 和测试。

最佳答案

经过进一步研究可以回答我自己的问题。

https://jsfiddle.net/btroncone/upy6nr6n/

基本上我需要在 getThings 中而不是在effect中进行捕获。

 getThings() {
    return Observable.fromPromise(this.promiseBasedThing.getTheThings())
      .catch((error) => Observable.of(error));
  }

还了解到,使用简单的 rsjx 示例来解决这些问题比尝试使用 ngrx/effects 来解决要容易得多。这仍然有两个 catch 语句,但测试模拟现在与现实中的工作方式相匹配。

关于ngrx-effects - ngrx/effects - 如何使用 Promise 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233880/

相关文章:

Ngrx 存储出现错误,因为类型上不存在属性 'ofType'

angular - NgRx 效果 - 映射操作以进行顺序服务调用并更新存储

rxjs - 需要帮助理解这个 Ngrx 效果

angular - 在效果中注入(inject)服务时的循环依赖

node.js - 如何等待发货完成后再从商店挑选。 Ngrx相关问题

angular - 关于从 NgRx 存储中选择数据的问题

javascript - 错误后可观察到 rx 损坏

angular - 在使用可观察对象通过 NGRX 调用 API 之前检查 Angular Store 中的数据

Angular 无法解析 SomeEffect (?) 的所有参数

从组件分派(dispatch)操作时未调用ngrx效果