Skip to content

Latest commit

 

History

History
65 lines (45 loc) · 1.94 KB

File metadata and controls

65 lines (45 loc) · 1.94 KB
description Modern alternatives to the mockdate package for mocking time in tests

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.

import MockDate from 'mockdate' // [!code --]
import { vi, test, expect } from 'vitest' // [!code ++]

test('freeze date', () => {
  MockDate.set('2026-01-01') // [!code --]
  vi.useFakeTimers() // [!code ++]
  vi.setSystemTime(new Date('2026-01-01')) // [!code ++]

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

  MockDate.reset() // [!code --]
  vi.useRealTimers() // [!code ++]
})

node:test

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

import MockDate from 'mockdate' // [!code --]
import { test } from 'node:test' // [!code ++]
import assert from 'node:assert/strict' // [!code ++]

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

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

  MockDate.reset() // [!code --]
})

bun:test

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

import MockDate from 'mockdate' // [!code --]
import { test, expect, mock } from 'bun:test' // [!code ++]

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

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

  MockDate.reset() // [!code --]
  mock.timers.reset() // [!code ++]
})