Remove/disconnect epics 来自 redux-observable

Remove/disconnect epics from redux-observable

我们 运行 我们在 Node 中进行集成测试,使用酶的安装和 jsdom 来呈现完整的应用程序。对于每个测试,我们都会创建一个新商店

return createStore(
    reducer,
    stateShape,
    composeEnhancers(
        applyMiddleware(epicMiddleware, navMiddleware)
    )
);

不幸的是,在进行多次测试时我注意到每个史诗都被附加了多次,所以不是一个史诗表演一个动作,而是 10 个相同的动作!有没有一种方法可以在每次测试结束时 运行 进行清理,以便 epics 分离并且不再收听?

我们正在使用 redux、redux-observable 和 enyzme+mocha 进行测试。谢谢!

每次创建新商店时,您都需要为您提供的 epicMiddleware 创建一个新实例。

或者,epicMiddleware.replaceEpic(rootEpic) 可让您替换当前的 运行 根史诗,但我不确定在这种情况下是否能解决您的问题。

由于 replaceEpicredux-observable@1 开始日落,您将需要使用这里概述的这种方法 w/ BehaviorSubjectswitchMap 如果您在以后的版本:

https://redux-observable.js.org/docs/recipes/HotModuleReplacement.html

import { rootEpic, anotherRootEpic } from './where-ever-they-are';
import { BehaviorSubject } from 'rxjs';
import { switchMap } from 'rxjs/operators';

const epicMiddleware = createEpicMiddleware();
const store = createStore(rootReducer, applyMiddleware(epicMiddleware));

const epic$ = new BehaviorSubject(rootEpic);
// Every time a new epic is given to epic$ it
// will unsubscribe from the previous one then
// call and subscribe to the new one because of
// how switchMap works
const hotReloadingEpic = (...args) =>
  epic$.pipe(
    switchMap(epic => epic(...args))
  );

epicMiddleware.run(hotReloadingEpic);

//  this next line swaps the epic
epic$.next(anotherRootEpic);