【问题标题】:How to easily test redux-observable epic that emits an action after 5 minutes?如何轻松测试 5 分钟后发出动作的 redux-observable 史诗?
【发布时间】:2018-01-11 20:05:27
【问题描述】:

我有一个史诗,它在 SOME_ACTION 之后 5 分钟后发出 SOME_OTHER_ACTION(使用延迟运算符)。 我想使用 jest 或 sinon useFakeTimers 方法来执行以下操作:调度一个动作,等待 5 分钟并测试是否调度了另一个动作。 我真的不想使用弹珠图,也不想注入 TestScheduler。 我也不想等待 5 分钟的实时时间。

const timeBefore = new Date().getTime() / 1000;
store.dispatch(SOME_ACTION);
// wait 5 minutes
jest.runTimersToTime(5 * 60 * 1000);
expect(store.getActions()).toEqual([ SOME_ACTION, SOME_OTHER_ACTION ]);
expect(store.getActions()[1].time).toEqual(timeBefore + 5 * 60 * 1000);

【问题讨论】:

  • 您能详细说明问题是什么吗? jest.runTimersToTime() 应该可以工作。
  • 但它没有,它从不发出 SOME_OTHER_ACTION。虽然,如果我像这样模拟延迟运算符:Rx.Observable.prototype.delay = function () { return this } 它会立即发出动作(5 分钟不要过去)
  • 对不起!我不知道究竟是什么问题以及如何重现它。
  • 你能设置超时时间(将其添加到有效负载中)然后用 100 毫秒进行测试吗?
  • 我可能可以,我昨天考虑过。现在这是一个很好的解决方案,但想象一下,如果我有很多史诗被延迟,我需要全部测试。连续运行测试。必须有模拟超时的方法......

标签: testing timer rxjs redux-observable


【解决方案1】:

所以我最终做的是:将 RxJS 替换为 xstream,并将 adapter 用于 redux-observable,相应地修改了我的史诗。 事实证明,Jest 在使用 fakeTimers 时没有正确处理 Date,所以我使用 lolex 来处理假定时器。 有关完整示例,请参阅我的 gist。 (我没有找到简单的方法来测试或替换内部 RxJS 延迟,所以我不得不使用不同的响应库)。

clock.setTimeout(() => {
  expect(store.getActions()).toEqual([trainIncomingAction, reminderAction]);
  done();
}, 60 * 60 * 1001);
clock.runToLast();

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 2019-01-23
    • 2017-03-17
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多