【发布时间】: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 帧。我不明白为什么。我希望有人能给我解释一下。
【问题讨论】:
-
你能在 stackblitz 上创建一个复制品吗?
-
我花了一些时间,但我设法做到了。它在这里:stackblitz.com/edit/react-ts-vih2de?file=src/core/__tests__/…。您应该能够运行 yarn test 并看到它工作正常。
标签: typescript unit-testing rxjs redux-observable rxjs-marbles