gpt4 book ai didi

typescript - Observable.fromPromise 在单元测试期间为空

转载 作者:搜寻专家 更新时间:2023-10-30 21:15:52 24 4
gpt4 key购买 nike

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":"[
...

我认为这个问题与返回 promise 的 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)));

});

最佳答案

这有点不幸,但在 Rx v5 的 TestScheduler 上下文中并没有很好的方法让 promise 同步解析。出于这些原因,如果 Observable 源从 promise 开始,它将不适用于大理石测试,您必须通过订阅创建不同的断言。

检查 https://github.com/ReactiveX/rxjs/issues/701/https://github.com/ReactiveX/rxjs/pull/745如果您想了解失败原因的详细信息。

关于typescript - Observable.fromPromise 在单元测试期间为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com