Skip to content

يتيح لك bun:test تغيير الوقت في اختباراتك.

هذا يعمل مع أي مما يلي:

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

NOTE

المؤقتات لا تتأثر بعد، لكن قد يكون ذلك في إصدار مستقبلي من Bun.

setSystemTime

لتغيير وقت النظام، استخدم setSystemTime:

test.ts
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:

test.ts
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:

test.ts
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() للحصول على الطابع الزمني المحاكي الحالي:

test.ts
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 في وقت التشغيل:

test.ts
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 تحرير