【问题标题】:Remove/disconnect epics from redux-observable从 redux-observable 中删除/断开史诗
【发布时间】:2017-05-06 00:55:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js redux mocha.js rxjs5 redux-observable


    【解决方案1】:

    每次创建新商店时,都需要创建一个新的史诗中间件实例。

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

    【讨论】:

      【解决方案2】:

      由于replaceEpicredux-observable@1 开始,您需要使用此处概述的这种方法,其中包含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);
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-13
        • 2019-01-23
        • 2017-04-22
        • 2017-08-28
        • 2020-12-30
        • 2018-09-15
        • 2020-06-03
        • 2018-01-20
        相关资源
        最近更新 更多