【问题标题】:Why are there 3 additional frames when marble testing Observables that error out?为什么在弹珠测试 Observables 时会出现 3 个额外的帧?
【发布时间】:2021-07-17 17:20:42
【问题描述】:

我正在测试以下 redux-observable 史诗:

export const loginEpic: Epic<LoginActionTypes> = (action$, state$, { ajax }) => action$.pipe(
  filter(isOfType(LOGIN)),
  mergeMap(action => login(action.payload.credentials, ajax).pipe(
    map(ajaxResponseObject => ajaxResponseObject.response as User),
    map(user => loginSuccess(user)),
    catchError((ajaxResponseObject: AjaxResponse) => of(loginFail(ajaxResponseObject.response as NodeJS.ErrnoException)))
  ))
);

我编写了两个类似的测试来验证 loginSuccess 和 loginFail 是否正常工作:(我已经排除了一些模拟操作):

登录成功

      const actionInput$ = hot('-a', actionValues);
      const action$ = new ActionsObservable(actionInput$);

      const state$ = new StateObservable(new BehaviorSubject(null), null);

      const responseInput$ = cold('--a', responseValue);
      const dependencies = { ajax: () => responseInput$ };

      const output$ = loginEpic(action$, state$, dependencies);
      expectObservable(output$).toBe('---b', actionValues);

登录失败

      const actionInput$ = hot('-a', actionValues);
      const action$ = new ActionsObservable(actionInput$);

      const state$ = new StateObservable(new BehaviorSubject(null), null);

      const responseInput$ = cold('--#', undefined, mockResponse);
      const dependencies = { ajax: () => responseInput$ };

      const output$ = loginEpic(action$, state$, dependencies);
      expectObservable(output$).toBe('------b', actionValues);

它们都在工作,但是,测试框架说它预计比之前的测试多 3 帧。我不明白为什么。我希望有人能给我解释一下。

【问题讨论】:

标签: typescript unit-testing rxjs redux-observable rxjs-marbles


【解决方案1】:

不幸的是,TestScheduler 是有状态的,因此您会看到之前运行的测试的效果。

我创建了a fork of your project,它会在每个测试中初始化一个实例。

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多