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() でモックされた時刻を取得

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");
});

Bun by www.bunjs.com.cn 編集