Skip to content

bun:test te permite cambiar qué hora es en tus pruebas.

Esto funciona con cualquiera de los siguientes:

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

NOTE

Los temporizadores aún no se ven afectados, pero podrían estarlo en una versión futura de Bun.

setSystemTime

Para cambiar la hora del sistema, usa setSystemTime:

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

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

test("es 2020", () => {
  expect(new Date().getFullYear()).toBe(2020);
});

Para soportar pruebas existentes que usan useFakeTimers y useRealTimers de Jest, puedes usar useFakeTimers y useRealTimers:

test.ts
ts
test("igual que en 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("a diferencia de en jest", () => {
  const OriginalDate = Date;
  jest.useFakeTimers();
  if (typeof Bun === "undefined") {
    // En Jest, el constructor Date cambia
    // Eso puede causar todo tipo de bugs porque de repente Date !== Date antes de la prueba.
    expect(Date).not.toBe(OriginalDate);
    expect(Date.now).not.toBe(OriginalDate.now);
  } else {
    // En bun:test, el constructor Date no cambia cuando usas useFakeTimers
    expect(Date).toBe(OriginalDate);
    expect(Date.now).toBe(OriginalDate.now);
  }
});

Restablecer la hora del sistema

Para restablecer la hora del sistema, no pases argumentos a setSystemTime:

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

test("fue 2020, por un momento.", () => {
  // ¡Establécelo a algo!
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
  expect(new Date().getFullYear()).toBe(2020);

  // ¡Restablécelo!
  setSystemTime();

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

Obtener hora mockeada con jest.now()

Cuando estás usando tiempo mockeado (con setSystemTime o useFakeTimers), puedes usar jest.now() para obtener la marca de tiempo mockeada actual:

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

test("obtener la hora mockeada actual", () => {
  jest.useFakeTimers();
  jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));

  expect(Date.now()).toBe(1577836800000); // Marca de tiempo del 1 de enero de 2020
  expect(jest.now()).toBe(1577836800000); // Mismo valor

  jest.useRealTimers();
});

Esto es útil cuando necesitas acceder directamente al tiempo mockeado sin crear un nuevo objeto Date.

Establecer la zona horaria

Por defecto, la zona horaria para todas las ejecuciones de bun test se establece en UTC (Etc/UTC) a menos que se anule. Para cambiar la zona horaria, pasa la variable de entorno $TZ a bun test:

bash
TZ=America/Los_Angeles bun test

O establece process.env.TZ en tiempo de ejecución:

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

test("¡Bienvenido a California!", () => {
  process.env.TZ = "America/Los_Angeles";
  expect(new Date().getTimezoneOffset()).toBe(420);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});

test("¡Bienvenido a Nueva York!", () => {
  // A diferencia de en Jest, puedes establecer la zona horaria múltiples veces en tiempo de ejecución y funcionará.
  process.env.TZ = "America/New_York";
  expect(new Date().getTimezoneOffset()).toBe(240);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});

Bun por www.bunjs.com.cn editar