ジェストモックタイマー
タイムアウトをテストする際の最大のハードルの1つは、タイムアウトを待つことです。 Jestはこれを回避する方法を提供します。
runAllTimers
しばらくしてからイベントを発行するプログラムをテストしているが、そのイベントが実際に発行されるまでどれだけ長く待ちたくないとします。 Jestには、jest.runAllTimers
関数を介してsetTimeout
で設定されたコールバックを即座に実行するオプションがあります。
// This has to be called before using fake timers.
jest.useFakeTimers();
it('closes some time after being opened.', (done) => {
// An automatic door that fires a `closed` event.
const autoDoor = new AutoDoor();
autoDoor.on('closed', done);
autoDoor.open();
// Runs all pending timers. whether it's a second from now or a year.
jest.runAllTimers();
});
runTimersToTime
しかし、すべてのタイマーを実行したくない場合はどうでしょうか。 一部の時間の経過のみをシミュレートしたい場合はどうなりますか? runTimersToTime
はあなたのためにここにあります。
jest.useFakeTimers();
it('announces it will close before closing.', (done) => {
const autoDoor = new AutoDoor();
// The test passes if there's a `closing` event.
autoDoor.on('closing', done);
// The test fails if there's a `closed` event.
autoDoor.on('closed', done.fail);
autoDoor.open();
// Only move ahead enough time so that it starts closing, but not enough that it is closed.
jest.runTimersToTime(autoDoor.TIME_BEFORE_CLOSING);
});