Skip to content

bun:test 允許你更改測試中的時間。

這適用於以下任何情況:

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

NOTE

計時器尚未受到影響,但可能在 Bun 的未來版本中實現。

setSystemTime

要更改系統時間,請使用 setSystemTime

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

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

test("現在是 2020 年", () => {
  expect(new Date().getFullYear()).toBe(2020);
});

為了支持使用 Jest 的 useFakeTimersuseRealTimers 的現有測試,你可以使用 useFakeTimersuseRealTimers

ts
test("就像在 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("與 jest 不同", () => {
  const OriginalDate = Date;
  jest.useFakeTimers();
  if (typeof Bun === "undefined") {
    // 在 Jest 中,Date 構造函數會改變
    // 這可能導致各種錯誤,因為突然 Date !== Date 在測試之前。
    expect(Date).not.toBe(OriginalDate);
    expect(Date.now).not.toBe(OriginalDate.now);
  } else {
    // 在 bun:test 中,當你使用 useFakeTimers 時,Date 構造函數不會改變
    expect(Date).toBe(OriginalDate);
    expect(Date.now).toBe(OriginalDate.now);
  }
});

重置系統時間

要重置系統時間,請不傳遞參數給 setSystemTime

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

test("曾經是 2020 年,但只是一瞬間。", () => {
  // 設置為某個時間!
  setSystemTime(new Date("2020-01-01T00:00:00.000Z"));
  expect(new Date().getFullYear()).toBe(2020);

  // 重置它!
  setSystemTime();

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

使用 jest.now() 獲取模擬時間

當你使用模擬時間(使用 setSystemTimeuseFakeTimers)時,你可以使用 jest.now() 獲取當前模擬時間戳:

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

test("獲取當前模擬時間", () => {
  jest.useFakeTimers();
  jest.setSystemTime(new Date("2020-01-01T00:00:00.000Z"));

  expect(Date.now()).toBe(1577836800000); // 2020 年 1 月 1 日時間戳
  expect(jest.now()).toBe(1577836800000); // 相同的值

  jest.useRealTimers();
});

當你需要直接訪問模擬時間而不創建新的 Date 對象時,這很有用。

設置時區

默認情況下,所有 bun test 運行的時區都設置為 UTC(Etc/UTC),除非被覆蓋。要更改時區,可以將 $TZ 環境變量傳遞給 bun test

bash
TZ=America/Los_Angeles bun test

或者在運行時設置 process.env.TZ

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

test("歡迎來到加利福尼亞!", () => {
  process.env.TZ = "America/Los_Angeles";
  expect(new Date().getTimezoneOffset()).toBe(420);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/Los_Angeles");
});

test("歡迎來到紐約!", () => {
  // 與 Jest 不同,你可以在運行時多次設置時區,它會正常工作。
  process.env.TZ = "America/New_York";
  expect(new Date().getTimezoneOffset()).toBe(240);
  expect(new Intl.DateTimeFormat().resolvedOptions().timeZone).toBe("America/New_York");
});

Bun學習網由www.bunjs.com.cn整理維護