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

问题描述:

我使用ngrx/effects进行弹珠测试。我有一个使用承诺的服务。我希望我的效果能够调用服务并处理成功和错误状态。我有这样的代码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 Promise似乎不适用于弹珠测试。 This SO question给出了一个错误处理的想法,但它似乎不可能测试,因为它有一个Promise。

如何在错误处理,承诺和测试中使用ngrx/effects。

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

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

基本上,我需要做的抓在getThings而不是在效果。

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

另外据悉,这是很容易解决这些问题用一个简单的例子rsjx,而不是试图去解决它,而使用NGRX /效果了。这仍然有两个catch语句,但测试嘲笑现在匹配它在现实中的工作方式。