Skip to content

bun:test vous permet de changer l'heure qu'il est dans vos tests.

Cela fonctionne avec l'un des éléments suivants :

  • Date.now
  • new 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 :

ts
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 :

ts
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 :

ts
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 :

ts
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 :

bash
TZ=America/Los_Angeles bun test

Ou définissez process.env.TZ à l'exécution :

ts
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");
});

Bun édité par www.bunjs.com.cn