bun:test 允許你更改測試中的時間。
這適用於以下任何情況:
Date.nownew 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 的 useFakeTimers 和 useRealTimers 的現有測試,你可以使用 useFakeTimers 和 useRealTimers:
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() 獲取模擬時間
當你使用模擬時間(使用 setSystemTime 或 useFakeTimers)時,你可以使用 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");
});