我需要为我在这个loadEpic史诗中使用的自定义操作符编写大理石测试--这可以帮助我避免操作INITIALiZE有时会被分派到很晚而我得到LOAD_FAILURE的问题。
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操作符的,它运行得很好:
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或任何类似的方法写这个测试吗?非常感谢!
发布于 2019-10-25 13:25:50
您描述了三个事件流:
中的对象相同)
然后,您希望您的运算符使用toBeObservable匹配器将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$);
});请注意,我是如何格式化代码的,以便在另一个流下描述一个流。它确实有助于处理长时间的事件。
您还可以为边缘情况编写单独的规范。这取决于你想要测试的行为。
https://stackoverflow.com/questions/58557974
复制相似问题