与redux-mock-store一起使用时,redux-observable流中的重复操作

时间:2017-12-31 20:01:24

标签: ecmascript-6 redux jest redux-observable redux-mock-store

我打开了一个问题,但万一我做错了什么:

使用jest和redux-mock-store编写单个测试时,一切都按预期工作。 但是如果我多次使用mockStore(在同一个测试中,甚至在另一个测试中),那么在任何创建的商店中调度的动作将在observable中多次发送(但在store中只发送一次,如store.getActions()的状态。

这是一个复制回购:https://framagit.org/jalil/redux-observable-mock-store-duplicate

tldr;

这有效:

const store = mockStore();
store.dispatch({ type: 'FOO' }); // -> Observable get 1 FOO action

这不是:

const store = mockStore();
store2 = mockStore();
mockStore();
store.dispatch({ type: 'FOO' }); // => Observable get 3 FOO actions

或者:

const store = mockStore();
store2 = mockStore();
mockStore();
mockStore();
mockStore();
store.dispatch({ type: 'FOO' }); // -> Observable get 5 FOO actions

......等等......

我希望,因为我使用replaceEpic和mockStore,并且我使用不同的jest测试,一个测试不应该影响另一个,一个mockStore不应该影响另一个。

所以,我希望,即使我有多个测试每个调用mockStore(),让我的史诗接收正确的动作流。

已解决的问题:

1 个答案:

答案 0 :(得分:4)

redux-observable目前假设createEpicMiddleware()返回的中间件函数不会被多次调用。每次调用mockStore时,redux-mock-store都会调用它。虽然这种行为可能没有正式记录,但我的直觉告诉我,redux-observable不应该做出这个假设。像redux-saga这样的类似的库也曾经使用过,但它们可能已经停止了,我还没有检查过。

目前还不清楚为什么以前从未有人注意到这一点。我最近没有看到对这两个库引入任何显着变化。我最好的猜测是它没有任何可察觉的副作用,所以没有人注意到。例如您的示例不会过滤任何操作或发出任何操作,而只是始终使用.do()进行记录。

我现在正在度假,所以我不能在本周晚些时候深入研究这个问题。抱歉!但是你可以通过创建一个新的epicMiddleware并为每个测试调用configureMockStore而不是重用它来解决它。一个例子可能是这样的:

const mockStore = (...args) => {
  const epicMiddleware = createEpicMiddleware(someEpic);
  const factory = configureMockStore([epicMiddleware]);
  return factory(...args);
};

根据您的需求进行调整;例如如果你需要改变根史诗。

我们会在您的机票中跟踪此信息:https://github.com/redux-observable/redux-observable/issues/389