bun:test vous permet de changer l'heure qu'il est dans vos tests.
Cela fonctionne avec l'un des éléments suivants :
Date.nownew Date()new Intl.DateTimeFormat().format()
NOTE
Les timers ne sont pas encore impactés, mais pourraient l'être dans une future version de Bun.setSystemTime
Pour changer l'heure système, utilisez setSystemTime :
import { setSystemTime, beforeAll, test, expect } from "bun:test";
beforeAll(() => {
setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
});
test("nous sommes en 2020", () => {
expect(new Date().getFullYear()).toBe(2020);
});Pour prendre en charge les tests existants qui utilisent useFakeTimers et useRealTimers de Jest, vous pouvez utiliser useFakeTimers et useRealTimers :
test("comme dans 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("contrairement à jest", () => {
const OriginalDate = Date;
jest.useFakeTimers();
if (typeof Bun === "undefined") {
// Dans Jest, le constructeur Date change
// Cela peut causer toutes sortes de bugs car soudainement Date !== Date avant le test.
expect(Date).not.toBe(OriginalDate);
expect(Date.now).not.toBe(OriginalDate.now);
} else {
// Dans bun:test, le constructeur Date ne change pas lorsque vous utilisez useFakeTimers
expect(Date).toBe(OriginalDate);
expect(Date.now).toBe(OriginalDate.now);
}
});Réinitialiser l'heure système
Pour réinitialiser l'heure système, ne passez aucun argument à setSystemTime :
import { setSystemTime, expect, test } from "bun:test";
test("nous étions en 2020, un instant.", () => {
// Définir à quelque chose !
setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
expect(new Date().getFullYear()).toBe(2020);
// réinitialiser !
setSystemTime();
expect(new Date().getFullYear()).toBeGreaterThan(2020);
});Obtenir l'heure mockée avec jest.now()
Lorsque vous utilisez une heure mockée (avec setSystemTime ou useFakeTimers), vous pouvez utiliser jest.now() pour obtenir l'horodatage mocké actuel :
import { test, expect, jest } from "bun:test";
test("obtenir l'heure mockée actuelle", () => {
jest.useFakeTimers();
jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
expect(Date.now()).toBe(1577836800000); // Horodatage du 1er janvier 2020
expect(jest.now()).toBe(1577836800000); // Même valeur
jest.useRealTimers();
});Ceci est utile lorsque vous devez accéder directement à l'heure mockée sans créer un nouvel objet Date.
Définir le fuseau horaire
Par défaut, le fuseau horaire pour toutes les exécutions bun test est défini sur UTC (Etc/UTC) sauf s'il est remplacé. Pour changer le fuseau horaire, passez soit la variable d'environnement $TZ à bun test :
TZ=America/Los_Angeles bun testOu définissez process.env.TZ à l'exécution :
import { test, expect } from "bun:test";
test("Bienvenue en Californie !", () => {
process.env.TZ = "America/Los_Angeles";
expect(new Date().getTimezoneOffset()).toBe(420);
expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});
test("Bienvenue à New York !", () => {
// Contrairement à Jest, vous pouvez définir le fuseau horaire plusieurs fois à l'exécution et cela fonctionnera.
process.env.TZ = "America/New_York";
expect(new Date().getTimezoneOffset()).toBe(240);
expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});