1

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

当使用 jest 和 redux-mock-store 编写单个测试时,一切都按预期工作。但是,如果我多次使用 mockStore(在同一个测试中甚至在另一个测试中),那么在任何创建的商店中调度的操作都会在 observable 中多次发送(但在商店中只有一次,如 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(),让我的史诗接收正确的动作流。

打开的问题:

4

1 回答 1

5

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

于 2017-12-31T20:52:04.080 回答