【问题标题】:Duplicate actions in redux-observable stream when used with redux-mock-store与 redux-mock-store 一起使用时,redux-observable 流中的重复操作
【发布时间】:2017-12-31 20:01:24
【问题描述】:

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

使用 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(),我的史诗也能收到正确的动作流。

打开的问题:

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 谢谢@jayphelps!这就是我的假设......我可以确认,如果我在每次测试之前重新创建 configureMockStoremockStore,它会按预期工作,所以没有这种冲动:-)
    • 只是为了回应您的最佳猜测,我不认为这就是为什么没有人注意到...我希望我的复制示例简单,所以它什么都不做,但我在真实的项目中使用了这个世界史诗。我想没有人看到它,因为没有人测试史诗 :-) 或者每个人只有一个测试用例......或者可能只有一个模拟商店......或者每次都重新定义createEpicMiddleware......
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2021-02-03
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多