Ecmascript 6 与redux模拟存储一起使用时,redux可观察流中存在重复操作

Ecmascript 6 与redux模拟存储一起使用时,redux可观察流中存在重复操作,ecmascript-6,redux,jestjs,redux-observable,redux-mock-store,Ecmascript 6,Redux,Jestjs,Redux Observable,Redux Mock Store,我在上打开了一个问题,但如果我做错了什么: 当使用jest和redux模拟存储编写单个测试时,一切都按预期进行。 但是如果我多次使用mockStore(在同一个测试中,甚至在另一个测试中),那么在任何创建的存储中调度的操作都会在observable中发送多次(但在存储中仅发送一次,如store.getActions()状态) 这是一份复制回购协议: tldr; 这项工作: const store = mockStore(); store.dispatch({ type: 'FOO' }); //

我在上打开了一个问题,但如果我做错了什么:

当使用jest和redux模拟存储编写单个测试时,一切都按预期进行。 但是如果我多次使用mockStore(在同一个测试中,甚至在另一个测试中),那么在任何创建的存储中调度的操作都会在observable中发送多次(但在存储中仅发送一次,如store.getActions()状态)

这是一份复制回购协议:

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
或:

……等等

我希望,当我使用replacepic和mockStore时,我使用不同的jest测试,一个测试不应该影响另一个,一个mockStore不应该影响另一个

因此,我希望,即使我有多个测试,每个测试都调用mockStore(),我的epics也能收到正确的操作流

公开发行:


redux observable当前假设
CreatePicMiddleware()返回的中间件函数
不会被多次调用。每次调用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);
};
根据您的需要进行调整;例如,如果您需要更改根目录


我们将在您的记录单中跟踪这一点:

redux observable当前假定由
CreatePicMiddleware()返回的中间件函数
不会被多次调用。每次调用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);
};
根据您的需要进行调整;例如,如果您需要更改根目录


我们将在您的记录中跟踪这一点:

谢谢@jayphelps!这就是我所假设的……我可以确认,如果我在每次测试之前重新创建
配置mockStore
mockStore
,它将按预期工作,因此没有任何冲动:-)只是回应您的最佳猜测,我不认为这就是为什么没有人注意到。。。我希望我的复制示例很简单,所以它什么都不做,但我在真实的项目中使用了真实的epic。我想没有人看到它,因为没有人测试史诗:-)或者可能每个测试用例只有一个。。。或者是一个模拟商店。。。或者每次重新定义
createEpicMiddleware
,让我们继续在Thank you@jayphelps中讨论!这就是我所想的。。。我可以确认,如果我在每次测试之前重新创建
configureMockStore
mockStore
,它会按预期工作,因此没有任何冲动:-)只是为了回应您的最佳猜测,我不认为这是为什么没有人注意到。。。我希望我的复制示例很简单,所以它什么都不做,但我在真实的项目中使用了真实的epic。我想没有人看到它,因为没有人测试史诗:-)或者可能每个测试用例只有一个。。。或者是一个模拟商店。。。或者每次都重新定义
createEpicMiddleware
,让我们在中继续讨论