我正在使用ngrx /效果和弹珠测试。我有一个使用promises的服务。我希望我的效果调用服务并处理成功和错误状态。我有这样的代码
效果:
.mergeMap(() =>
this.service.getThings()
.map((things) => new SetThingsAction(things))
.catch((error) =>
of(new HandleAPIErrorAction(error))
)
)
.catch((error) =>
of(new HandleAPIErrorAction(error))
);
服务:
public geThings() {
return Observable.fromPromise(this.promiseBasedThing.getTheThings());
}
然后测试:
actions = hot("a", { a: new GetThingsAction() });
const response = cold("-#", {});
service.getThings.and.returnValue( response );
const expected = cold("-b", { b: new HandleAPIErrorAction("error") });
expect(effects.getThings$).toBeObservable(expected);
这实际上都有效。然而,效果的双重捕获似乎显然很糟糕,可能表明我不明白Observables是如何工作的。在现实世界中,只有后来的捕获才有效。在测试中,第一个是有效的。
基于this看来Promise不适用于弹珠测试。 This SO question给出了一个关于错误处理的想法,但似乎无法测试,因为它有一个Promise。
如何在错误处理,承诺和测试中使用ngrx / effects。
答案 0 :(得分:0)
进一步研究后可以回答我自己。
https://jsfiddle.net/btroncone/upy6nr6n/
基本上我需要在getThings而不是效果中执行catch。
getThings() {
return Observable.fromPromise(this.promiseBasedThing.getTheThings())
.catch((error) => Observable.of(error));
}
还了解到使用简单的rsjx示例解决这些问题要容易得多,而不是在使用ngrx / effects时尝试解决它们。这仍然有两个catch语句,但现在测试模拟与现实中的工作方式相匹配。