Skip to content

bun:test ermöglicht es Ihnen, die aktuelle Zeit in Ihren Tests zu ändern.

Dies funktioniert mit allen folgenden Funktionen:

  • Date.now
  • new Date()
  • new Intl.DateTimeFormat().format()

NOTE

Timer sind noch nicht betroffen, könnten es aber in einer zukünftigen Version von Bun sein.

setSystemTime

Um die Systemzeit zu ändern, verwenden Sie setSystemTime:

test.ts
ts
import { setSystemTime, beforeAll, test, expect } from "bun:test";

beforeAll(() => {
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
});

test("es ist 2020", () => {
  expect(new Date().getFullYear()).toBe(2020);
});

Um bestehende Tests zu unterstützen, die Jests useFakeTimers und useRealTimers verwenden, können Sie useFakeTimers und useRealTimers verwenden:

test.ts
ts
test("genau wie 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("anders als in Jest", () => {
  const OriginalDate = Date;
  jest.useFakeTimers();
  if (typeof Bun === "undefined") {
    // In Jest ändert sich der Date-Konstruktor
    // Das kann alle Arten von Bugs verursachen, weil plötzlich Date !== Date vor dem Test ist.
    expect(Date).not.toBe(OriginalDate);
    expect(Date.now).not.toBe(OriginalDate.now);
  } else {
    // In bun:test ändert sich der Date-Konstruktor nicht, wenn Sie useFakeTimers verwenden
    expect(Date).toBe(OriginalDate);
    expect(Date.now).toBe(OriginalDate.now);
  }
});

Systemzeit zurücksetzen

Um die Systemzeit zurückzusetzen, übergeben Sie keine Argumente an setSystemTime:

test.ts
ts
import { setSystemTime, expect, test } from "bun:test";

test("es war 2020, für einen Moment.", () => {
  // Auf etwas setzen!
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
  expect(new Date().getFullYear()).toBe(2020);

  // Zurücksetzen!
  setSystemTime();

  expect(new Date().getFullYear()).toBeGreaterThan(2020);
});

Gemockte Zeit mit jest.now() abrufen

Wenn Sie gemockte Zeit verwenden (mit setSystemTime oder useFakeTimers), können Sie jest.now() verwenden, um den aktuellen gemockten Zeitstempel abzurufen:

test.ts
ts
import { test, expect, jest } from "bun:test";

test("die aktuelle gemockte Zeit abrufen", () => {
  jest.useFakeTimers();
  jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));

  expect(Date.now()).toBe(1577836800000); // 1. Jan 2020 Zeitstempel
  expect(jest.now()).toBe(1577836800000); // Gleicher Wert

  jest.useRealTimers();
});

Dies ist nützlich, wenn Sie direkt auf die gemockte Zeit zugreifen müssen, ohne ein neues Date-Objekt zu erstellen.

Zeitzone einstellen

Standardmäßig ist die Zeitzone für alle bun test-Läufe auf UTC (Etc/UTC) eingestellt, es sei denn, sie wird überschrieben. Um die Zeitzone zu ändern, übergeben Sie entweder die $TZ-Umgebungsvariable an bun test:

bash
TZ=America/Los_Angeles bun test

Oder setzen Sie process.env.TZ zur Laufzeit:

test.ts
ts
import { test, expect } from "bun:test";

test("Willkommen in Kalifornien!", () => {
  process.env.TZ = "America/Los_Angeles";
  expect(new Date().getTimezoneOffset()).toBe(420);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});

test("Willkommen in New York!", () => {
  // Anders als in Jest können Sie die Zeitzone mehrmals zur Laufzeit einstellen und es funktioniert.
  process.env.TZ = "America/New_York";
  expect(new Date().getTimezoneOffset()).toBe(240);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});

Bun von www.bunjs.com.cn bearbeitet