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