首页 > 解决方案 > 为什么在弹珠测试 Observables 时会出现 3 个额外的帧?

问题描述

我正在测试以下 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 帧。我不明白为什么。我希望有人可以向我解释。

标签: typescriptunit-testingrxjsredux-observablerxjs-marbles

解决方案


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

我已经为您的项目创建了一个分支,它为每个测试初始化​​一个实例。


推荐阅读