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