首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为这个定制的RxJS操作符编写大理石测试?

如何为这个定制的RxJS操作符编写大理石测试?
EN

Stack Overflow用户
提问于 2019-10-25 11:48:43
回答 1查看 471关注 0票数 0

我需要为我在这个loadEpic史诗中使用的自定义操作符编写大理石测试--这可以帮助我避免操作INITIALiZE有时会被分派到很晚而我得到LOAD_FAILURE的问题。

代码语言:javascript
复制
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 })))
        )
      )
    );

我就是这样写我的waitFor操作符的,它运行得很好:

代码语言:javascript
复制
const waitFor = <T>(
  state$: Observable<RootState>
): OperatorFunction<T, T> => source$ =>
  source$.pipe(
    switchMap(value =>
      state$.pipe(
        filter(state => state.navigation.initialized),
        take(1),
        mapTo(value)
      )
    )
  );

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-25 13:25:50

您描述了三个事件流:

  1. 状态(用简单的
  2. 来模拟它们(同样,您可以使用任何JS值作为模拟),
  3. 过滤操作(与

中的对象相同)

然后,您希望您的运算符使用toBeObservable匹配器将2转换为3。就这样。

代码语言:javascript
复制
  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$);
  });

请注意,我是如何格式化代码的,以便在另一个流下描述一个流。它确实有助于处理长时间的事件。

您还可以为边缘情况编写单独的规范。这取决于你想要测试的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58557974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档