bun:test te permite cambiar qué hora es en tus pruebas.
Esto funciona con cualquiera de los siguientes:
Date.nownew 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:
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("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:
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:
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:
TZ=America/Los_Angeles bun testO establece process.env.TZ en tiempo de ejecución:
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");
});