如何轻松测试 redux-observable 5 分钟后发出动作的史诗?
How to easily test redux-observable epic that emits an action after 5 minutes?
我有一个史诗,它在 SOME_ACTION 之后 5 分钟后发出 SOME_OTHER_ACTION(使用延迟运算符)。
我想使用 jest 或 sinon useFakeTimers 方法来执行以下操作:调度一个动作,等待 5 分钟并测试是否调度了另一个动作。
我真的不想使用大理石图,或注入 TestSchedulers。
我也不想等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);
所以我最后做的是:用 xstream, and used adapter 代替 redux-observable 的 RxJS,相应地修改了我的 epics。
事实证明,Jest 在使用 fakeTimers 时无法正确处理 Date,所以我使用 lolex 作为假计时器。
有关完整示例,请参阅我的 gist。
(我没有找到简单的方法来测试或替换内部 RxJS 延迟,所以我不得不使用不同的反应库)。
clock.setTimeout(() => {
expect(store.getActions()).toEqual([trainIncomingAction, reminderAction]);
done();
}, 60 * 60 * 1001);
clock.runToLast();
我有一个史诗,它在 SOME_ACTION 之后 5 分钟后发出 SOME_OTHER_ACTION(使用延迟运算符)。 我想使用 jest 或 sinon useFakeTimers 方法来执行以下操作:调度一个动作,等待 5 分钟并测试是否调度了另一个动作。 我真的不想使用大理石图,或注入 TestSchedulers。 我也不想等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);
所以我最后做的是:用 xstream, and used adapter 代替 redux-observable 的 RxJS,相应地修改了我的 epics。 事实证明,Jest 在使用 fakeTimers 时无法正确处理 Date,所以我使用 lolex 作为假计时器。 有关完整示例,请参阅我的 gist。 (我没有找到简单的方法来测试或替换内部 RxJS 延迟,所以我不得不使用不同的反应库)。
clock.setTimeout(() => {
expect(store.getActions()).toEqual([trainIncomingAction, reminderAction]);
done();
}, 60 * 60 * 1001);
clock.runToLast();