Skip to content

Replacements for mockdate

mockdate is mainly used in tests, and modern test runners already include built-in APIs for mocking time without pulling in an extra dependency.

vitest

vitest provides vi.useFakeTimers() and vi.setSystemTime() for mocking the current date during tests.

ts
import MockDate from 'mockdate'
import { vi, test, expect } from 'vitest'

test('freeze date', () => {
  MockDate.set('2026-01-01') 
  vi.useFakeTimers() 
  vi.setSystemTime(new Date('2026-01-01')) 

  expect(new Date().toISOString()).toBe('2026-01-01T00:00:00.000Z')

  MockDate.reset() 
  vi.useRealTimers() 
})

node:test

node:test supports mocking time via mock.timers since node 20.4.0 and later.

ts
import MockDate from 'mockdate'
import { test } from 'node:test'
import assert from 'node:assert/strict'

test('freeze date', (t) => {
  MockDate.set('2026-01-01') 
  t.mock.timers.enable({ apis: ['Date'], now: new Date('2026-01-01') }) 

  assert.equal(new Date().toISOString(), '2026-01-01T00:00:00.000Z')

  MockDate.reset() 
})

bun:test

bun:test provides mock.timers.enable() for mocking time in tests.

ts
import MockDate from 'mockdate'
import { test, expect, mock } from 'bun:test'

test('freeze date', () => {
  MockDate.set('2026-01-01') 
  mock.timers.enable({ now: new Date('2026-01-01') }) 

  expect(new Date().toISOString()).toBe('2026-01-01T00:00:00.000Z')

  MockDate.reset() 
  mock.timers.reset() 
})

Released under the MIT License. (1f304c6e)