ngrx / effects - 如何测试承诺

时间:2017-11-11 02:50:53

标签: ngrx-effects

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

1 个答案:

答案 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语句,但现在测试模拟与现实中的工作方式相匹配。