【问题标题】:ngrx/effects - How to test with a promisengrx/effects - 如何使用 promise 进行测试
【发布时间】:2017-11-12 01:29:09
【问题描述】:

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

效果: .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,Promises 似乎不适用于弹珠测试。 This SO question 给出了错误处理的想法,但似乎无法测试,因为它有一个 Promise。

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

【问题讨论】:

    标签: ngrx-effects


    【解决方案1】:

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

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

    基本上我需要在 getThings 中而不是在效果中进行捕捉。

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 2018-04-18
      • 2018-05-15
      • 2018-06-16
      • 2023-03-31
      • 2019-08-19
      • 1970-01-01
      • 2019-04-20
      • 2019-06-23
      相关资源
      最近更新 更多