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

Moo*_*her 3 promise observable jasmine typescript

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);
        }));
    });
Run Code Online (Sandbox Code Playgroud)

它在浏览器中工作,没有问题.但是,我也希望对它进行单元测试:

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$);
Run Code Online (Sandbox Code Playgroud)

测试失败,具体如下:

Expected 

to deep equal 
    {"frame":10,"notification":{"kind":"N","value":{"payload":"[
    ...
Run Code Online (Sandbox Code Playgroud)

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

});
Run Code Online (Sandbox Code Playgroud)

小智 10

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

如果您想详细说明为什么不成功,请查看https://github.com/ReactiveX/rxjs/issues/701/https://github.com/ReactiveX/rxjs/pull/745.