タイムアウトをテストする際の最大のハードルの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);
});