bun:test ti permette di cambiare che ore sono nei tuoi test.
Questo funziona con uno qualsiasi dei seguenti:
Date.nownew Date()new Intl.DateTimeFormat().format()
NOTE
I timer non sono ancora impattati, ma potrebbero esserlo in una futura release di Bun.setSystemTime
Per cambiare il tempo di sistema, usa setSystemTime:
import { setSystemTime, beforeAll, test, expect } from "bun:test";
beforeAll(() => {
setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
});
test("e il 2020", () => {
expect(new Date().getFullYear()).toBe(2020);
});Per supportare i test esistenti che usano useFakeTimers e useRealTimers di Jest, puoi usare useFakeTimers e useRealTimers:
test("proprio come in 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("diversamente da jest", () => {
const OriginalDate = Date;
jest.useFakeTimers();
if (typeof Bun === "undefined") {
// In Jest, il costruttore Date cambia
// Questo puo causare tutti i tipi di bug perche improvvisamente Date !== Date prima del test.
expect(Date).not.toBe(OriginalDate);
expect(Date.now).not.toBe(OriginalDate.now);
} else {
// In bun:test, il costruttore Date non cambia quando usi useFakeTimers
expect(Date).toBe(OriginalDate);
expect(Date.now).toBe(OriginalDate.now);
}
});Resettare il tempo di sistema
Per resettare il tempo di sistema, passa nessun argomento a setSystemTime:
import { setSystemTime, expect, test } from "bun:test";
test("era il 2020, per un momento.", () => {
// Impostalo a qualcosa!
setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
expect(new Date().getFullYear()).toBe(2020);
// resettalo!
setSystemTime();
expect(new Date().getFullYear()).toBeGreaterThan(2020);
});Ottenere il tempo finto con jest.now()
Quando stai usando il tempo finto (con setSystemTime o useFakeTimers), puoi usare jest.now() per ottenere il timestamp finto corrente:
import { test, expect, jest } from "bun:test";
test("ottieni il tempo finto corrente", () => {
jest.useFakeTimers();
jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
expect(Date.now()).toBe(1577836800000); // Timestamp 1 gen 2020
expect(jest.now()).toBe(1577836800000); // Stesso valore
jest.useRealTimers();
});Questo e utile quando hai bisogno di accedere al tempo finto direttamente senza creare un nuovo oggetto Date.
Impostare il fuso orario
Di default, il fuso orario per tutte le esecuzioni di bun test e impostato a UTC (Etc/UTC) a meno che non venga sovrascritto. Per cambiare il fuso orario, passa la variabile di ambiente $TZ a bun test:
TZ=America/Los_Angeles bun testO imposta process.env.TZ a runtime:
import { test, expect } from "bun:test";
test("Benvenuto in California!", () => {
process.env.TZ = "America/Los_Angeles";
expect(new Date().getTimezoneOffset()).toBe(420);
expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});
test("Benvenuto a New York!", () => {
// Diversamente da Jest, puoi impostare il fuso orario piu volte a runtime e funzionera.
process.env.TZ = "America/New_York";
expect(new Date().getTimezoneOffset()).toBe(240);
expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});