A comprehensive fake timer implementation for Jest that provides both legacy and modern timer mocking capabilities, enabling developers to control time flow in tests by mocking JavaScript's built-in timer functions.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Jest Fake Timers provides comprehensive timer mocking capabilities for Jest tests, enabling developers to control time flow by replacing JavaScript's built-in timer functions with controllable fake implementations. It offers two complementary approaches: ModernFakeTimers built on @sinonjs/fake-timers for advanced time control, and LegacyFakeTimers for backward compatibility.
npm install @jest/fake-timersimport { ModernFakeTimers, LegacyFakeTimers } from "@jest/fake-timers";
import type { Config } from "@jest/types";For CommonJS:
const { ModernFakeTimers, LegacyFakeTimers } = require("@jest/fake-timers");
// TypeScript types are available for TypeScript projectsimport { ModernFakeTimers } from "@jest/fake-timers";
import { makeProjectConfig } from "@jest/test-utils";
// Initialize modern fake timers
const fakeTimers = new ModernFakeTimers({
global: globalThis,
config: makeProjectConfig()
});
// Enable fake timers
fakeTimers.useFakeTimers();
// Your test code with timers...
setTimeout(() => console.log("Timer executed"), 1000);
// Advance time by 1 second
fakeTimers.advanceTimersByTime(1000);
// Clean up
fakeTimers.useRealTimers();
fakeTimers.dispose();Jest Fake Timers is designed around two main implementations:
Both implementations provide:
Advanced fake timer implementation with comprehensive time control, async operations, and @sinonjs/fake-timers integration.
interface ModernFakeTimersConstructor {
new (options: {
global: typeof globalThis;
config: Config.ProjectConfig;
}): ModernFakeTimers;
}
interface ModernFakeTimers {
useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): void;
useRealTimers(): void;
runAllTimers(): void;
runAllTimersAsync(): Promise<void>;
runOnlyPendingTimers(): void;
runOnlyPendingTimersAsync(): Promise<void>;
advanceTimersByTime(msToRun: number): void;
advanceTimersByTimeAsync(msToRun: number): Promise<void>;
advanceTimersToNextTimer(steps?: number): void;
advanceTimersToNextTimerAsync(steps?: number): Promise<void>;
advanceTimersToNextFrame(): void;
runAllTicks(): void;
setSystemTime(now?: number | Date): void;
getRealSystemTime(): number;
now(): number;
reset(): void;
clearAllTimers(): void;
getTimerCount(): number;
dispose(): void;
}Backward-compatible fake timer implementation with custom Jest timer control and precise execution ordering.
interface LegacyFakeTimersConstructor {
new <TimerRef = unknown>(options: {
global: typeof globalThis;
moduleMocker: ModuleMocker;
timerConfig: TimerConfig<TimerRef>;
config: StackTraceConfig;
maxLoops?: number;
}): LegacyFakeTimers<TimerRef>;
}
interface LegacyFakeTimers<TimerRef = unknown> {
useFakeTimers(): void;
useRealTimers(): void;
runWithRealTimers(cb: Callback): void;
runAllTimers(): void;
runOnlyPendingTimers(): void;
runAllTicks(): void;
runAllImmediates(): void;
advanceTimersByTime(msToRun: number): void;
advanceTimersToNextTimer(steps?: number): void;
reset(): void;
clearAllTimers(): void;
now(): number;
getTimerCount(): number;
dispose(): void;
}interface Config.FakeTimersConfig {
/** Auto-advance timers by specified milliseconds */
advanceTimers?: boolean | number;
/** APIs to exclude from faking */
doNotFake?: Array<FakeableAPI>;
/** Initial system time for fake timers */
now?: number | Date;
/** Maximum recursive timer limit */
timerLimit?: number;
/** Must be false for modern timers */
legacyFakeTimers?: false;
}
type FakeableAPI =
| 'Date'
| 'hrtime'
| 'nextTick'
| 'performance'
| 'queueMicrotask'
| 'requestAnimationFrame'
| 'cancelAnimationFrame'
| 'requestIdleCallback'
| 'cancelIdleCallback'
| 'setImmediate'
| 'clearImmediate'
| 'setInterval'
| 'clearInterval'
| 'setTimeout'
| 'clearTimeout';
interface TimerConfig<Ref> {
/** Convert timer ID to reference */
idToRef: (id: number) => Ref;
/** Convert reference to timer ID */
refToId: (ref: Ref) => number | void;
}
type Callback = (...args: Array<unknown>) => void;