0

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

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

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

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

4

2 回答 2

1

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

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

于 2016-12-20T18:10:58.013 回答
0

由于replaceEpic日落时分,redux-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);

于 2021-10-06T21:45:24.883 回答