Skip to content

bun:test позволяет изменять время в ваших тестах.

Это работает со следующим:

  • Date.now
  • new Date()
  • new Intl.DateTimeFormat().format()

NOTE

Таймеры пока не затронуты, но могут быть в будущем выпуске Bun.

setSystemTime

Для изменения системного времени используйте setSystemTime:

ts
import { setSystemTime, beforeAll, test, expect } from "bun:test";

beforeAll(() => {
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
});

test("сейчас 2020", () => {
  expect(new Date().getFullYear()).toBe(2020);
});

Для поддержки существующих тестов, использующих useFakeTimers и useRealTimers из Jest, вы можете использовать useFakeTimers и useRealTimers:

ts
test("как в jest", () => {
  jest.useFakeTimers();
  jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
  expect(new Date().getFullYear()).toBe(2020);
  jest.useRealTimers();
  expect(new Date().getFullYear()).toBeGreaterThan(2020);
});

test("в отличие от jest", () => {
  const OriginalDate = Date;
  jest.useFakeTimers();
  if (typeof Bun === "undefined") {
    // В Jest конструктор Date изменяется
    // Это может вызвать всевозможные ошибки, потому что внезапно Date !== Date до теста.
    expect(Date).not.toBe(OriginalDate);
    expect(Date.now).not.toBe(OriginalDate.now);
  } else {
    // В bun:test конструктор Date не изменяется при использовании useFakeTimers
    expect(Date).toBe(OriginalDate);
    expect(Date.now).toBe(OriginalDate.now);
  }
});

Сброс системного времени

Для сброса системного времени передайте setSystemTime без аргументов:

ts
import { setSystemTime, expect, test } from "bun:test";

test("было 2020, на мгновение.", () => {
  // Установить на что-то!
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
  expect(new Date().getFullYear()).toBe(2020);

  // сбросить!
  setSystemTime();

  expect(new Date().getFullYear()).toBeGreaterThan(2020);
});

Получение мокированного времени с jest.now()

При использовании мокированного времени (с setSystemTime или useFakeTimers) вы можете использовать jest.now() для получения текущего мокированного временного значения:

ts
import { test, expect, jest } from "bun:test";

test("получить текущее мокированное время", () => {
  jest.useFakeTimers();
  jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));

  expect(Date.now()).toBe(1577836800000); // временная метка 1 января 2020
  expect(jest.now()).toBe(1577836800000); // То же значение

  jest.useRealTimers();
});

Это полезно, когда вам нужно получить прямой доступ к мокированному времени без создания нового объекта Date.

Установка часового пояса

По умолчанию часовой пояс для всех запусков bun test установлен в UTC (Etc/UTC), если не переопределён. Для изменения часового пояса либо передайте переменную окружения $TZ в bun test:

bash
TZ=America/Los_Angeles bun test

Или установите process.env.TZ во время выполнения:

ts
import { test, expect } from "bun:test";

test("Добро пожаловать в Калифорнию!", () => {
  process.env.TZ = "America/Los_Angeles";
  expect(new Date().getTimezoneOffset()).toBe(420);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});

test("Добро пожаловать в Нью-Йорк!", () => {
  // В отличие от Jest, вы можете устанавливать часовой пояс несколько раз во время выполнения, и это будет работать.
  process.env.TZ = "America/New_York";
  expect(new Date().getTimezoneOffset()).toBe(240);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});

Bun от www.bunjs.com.cn