يتيح لك 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);
});لدعم الاختبارات الحالية التي تستخدم useFakeTimers و useRealTimers من Jest، يمكنك استخدام 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، منشئ Date لا يتغير عند استخدام useFakeTimers
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); // الطابع الزمني لـ 1 يناير 2020
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");
});