与 redux-mock-store 一起使用时 redux-observable 流中的重复操作
Duplicate actions in redux-observable stream when used with redux-mock-store
我打开了一个问题,但以防万一我做错了什么:
使用 jest 和 redux-mock-store 编写单个测试时,一切都按预期进行。
但是如果我多次使用 mockStore(在同一个测试中甚至在另一个测试中),那么在任何创建的商店中调度的动作都会在可观察对象中多次发送(但在商店中只发送一次,如 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(),我的 epics 也会收到正确的动作流。
未解决的问题:
redux-observable 目前假设 createEpicMiddleware()
返回的中间件函数不会被多次调用。 redux-mock-store 似乎每次调用 mockStore 时都会调用它。虽然这种行为可能没有正式记录,但我的直觉告诉我 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
我打开了一个问题,但以防万一我做错了什么:
使用 jest 和 redux-mock-store 编写单个测试时,一切都按预期进行。 但是如果我多次使用 mockStore(在同一个测试中甚至在另一个测试中),那么在任何创建的商店中调度的动作都会在可观察对象中多次发送(但在商店中只发送一次,如 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(),我的 epics 也会收到正确的动作流。
未解决的问题:
redux-observable 目前假设 createEpicMiddleware()
返回的中间件函数不会被多次调用。 redux-mock-store 似乎每次调用 mockStore 时都会调用它。虽然这种行为可能没有正式记录,但我的直觉告诉我 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