Open11
JestのFake Timers
jest.useFakeTimers()
を使う。
@sinonjs/fake-timers
に依存しているはず
jest.useFakeTimers
を使うと、↓は偽のタイマーから値を返す実装に置き換わる
Date
performance.now()
queueMicrotask()
setImmediate()
clearImmediate()
setInterval()
clearInterval()
setTimeout()
clearTimeout()
環境によって以下も同様に置き換わる。
- Node
process.hrtime
process.nextTick()
- JSDOM
requestAnimationFrame()
cancelAnimationFrame()
requestIdleCallback()
cancelIdleCallback()
useFakeTimers
のオプション
type FakeTimersConfig = {
advanceTimers?: boolean | number;
doNotFake?: Array<FakeableAPI>;
legacyFakeTimers?: boolean;
now?: number | Date;
timerLimit?: number;
};
jest.useRealTimers()
を呼ばない限り同じテストファイル内ではjest.useFakeTimers()
の偽のタイマーが生き続ける。
同じファイル内のどこで呼ぶこともできるけど、それがファイル内のテスト全体に影響する。
jest.useRealTimers()
を呼べばオリジナルの実装に戻る。
v29.5だと@jest/fake-timers
のソースコードはこの辺
LegacyFakeTimers
とModernFakeTimers
がある
export {default as LegacyFakeTimers} from './legacyFakeTimers';
export {default as ModernFakeTimers} from './modernFakeTimers';
LegacyFakeTimers
は@sinonjs/fake-timers
に依存していないタイマー実装。
useFakeTimers
を呼ぶと、this._fakeTimers.install()
が実行される
this._clock = this._fakeTimers.install(
this._toSinonFakeTimersConfig(fakeTimersConfig),
);
this._fakeTimers
は@sinonjs/fake-timers
のwithGlobal
をコンストラクタ関数で呼んだ結果を参照している。
this._fakeTimers = withGlobal(global);
@sinonjs/fake-timers
のwithGlobal
を見に行くと、大きい関数がある