【发布时间】:2018-02-16 19:40:31
【问题描述】:
loadAdList$ 是一个接入actions$ 流的 Observable:
loadAdList$: Observable<Action> = this.actions$
.ofType<adActions.Load>(adActions.LOAD)
.switchMap((action) => {
return Observable.fromPromise(store.findAll('ad', action.payload)
.then((ads) => {
return new adActions.LoadSuccess(ads);
})
.catch((err) => {
return new adActions.LoadFail(err);
}));
});
它在浏览器中工作,没有问题。但是,我也想对其进行单元测试:
actions$ = hot('-a', { a: loadAction });
const storeResponse = Promise.resolve(mockAds);
const expected$ = cold('-c', { c: loadSuccessAction });
spyOn(store, 'findAll').and.returnValue(storeResponse);
expect(effects.loadAdList$).toBeObservable(expected$);
测试失败并显示以下内容:
Expected
to deep equal
{"frame":10,"notification":{"kind":"N","value":{"payload":"[
...
我认为这个问题与返回承诺的 store.findAll 方法有关。这是基于以下测试的结果:
.switchMap((action) => {
// This test will pass
return Observable.from([new adActions.LoadSuccess(mockAds)]);
// This test will fail
return Observable.fromPromise(Promise.resolve(new adActions.LoadSuccess(mockAds)));
});
【问题讨论】:
-
Promise.resolve总是异步解析,而 RxJSTestScheduler- 支持hot和cold- 使用虚拟时间并且是同步的。出于这个原因,我怀疑 Promise 是否可以用于大理石图测试,但我可能是错的。至少,您的测试必须是异步的,并且不清楚它是否是异步的。 -
如果你想要一个异步测试运行器,我强烈推荐 blue-tape。
标签: typescript promise jasmine observable