bun:test ermöglicht es Ihnen, die aktuelle Zeit in Ihren Tests zu ändern.
Dies funktioniert mit allen folgenden Funktionen:
Date.nownew 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:
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("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:
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:
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:
TZ=America/Los_Angeles bun testOder setzen Sie process.env.TZ zur Laufzeit:
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");
});