我正在使用 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/