如何为redux observalbe Epic中使用的自定义RxJS操作符编写大理石测试

如何为redux observalbe Epic中使用的自定义RxJS操作符编写大理石测试,rxjs,jestjs,reactive-programming,redux-observable,rxjs-marbles,Rxjs,Jestjs,Reactive Programming,Redux Observable,Rxjs Marbles,我需要为此loadEpicepic中使用的自定义运算符编写MABLE测试-这有助于我避免操作INITIALiZE有时被延迟调度,并且我遇到LOAD\u故障: loadEpic: Epic<ExamManagementAction, ExamManagementAction, RootState> = ( action$, state$ ) => action$.pipe( filter(isActionOf(load)), w

我需要为此
loadEpic
epic中使用的自定义运算符编写MABLE测试-这有助于我避免操作
INITIALiZE
有时被延迟调度,并且我遇到
LOAD\u故障

loadEpic: Epic<ExamManagementAction, ExamManagementAction, RootState> = (
    action$,
    state$
  ) =>
    action$.pipe(
      filter(isActionOf(load)),
      waitFor(state$),
      switchMap(() =>
        this.load(state$).pipe(
          map(loadSuccess),
          catchError(error => of(loadFailure({ error })))
        )
      )
    );

你能帮我用
rxjsmarbles/jest
或任何类似的方法编写这个测试吗?非常感谢

您描述了三个事件流:

  • 状态(使用简单对象模拟它们)
  • 操作(同样,您可以使用任何JS值作为模拟)
  • 过滤操作(与第2部分中的对象相同)
  • 然后,您希望运算符使用toBeObservable matcher将2转换为3。就这样

      it('should reject given values until navigation is initialized', () => {
        const state$ = hot('   -i--u--u-i--  ', {u: {navigation: {initialized: false}}, i: {navigation: {initialized: true}}});
        const action$ = hot('  v----v--v---  ', {v: load});
        const expect$ = cold(' -v-------v--  ', {v: load});
    
        expect(action$.pipe(waitFor(state$))).toBeObservable(expect$);
      });
    
    
    请注意我是如何格式化代码的,以便在另一个流下描述一个流的。它确实有助于处理长时间的事件序列

    您还可以为边缘案例编写单独的规范。这取决于您要测试的行为。

    到目前为止您尝试了什么?有很好的例子和文档。首先阅读它们,并尝试自己实现它。如果出现故障,请附上测试代码并询问。
      it('should reject given values until navigation is initialized', () => {
        const state$ = hot('   -i--u--u-i--  ', {u: {navigation: {initialized: false}}, i: {navigation: {initialized: true}}});
        const action$ = hot('  v----v--v---  ', {v: load});
        const expect$ = cold(' -v-------v--  ', {v: load});
    
        expect(action$.pipe(waitFor(state$))).toBeObservable(expect$);
      });