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 before the test 가 되어 모든 종류의 버그를 일으킬 수 있습니다.
    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) 로 설정됩니다. 시간대를 변경하려면 bun test$TZ 환경 변수를 전달하거나.

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 편집