O hirunewani blog

VitestでsetTimeoutやsetIntervalなど時間が関与したコードのテストを記述する

Created at

VitestではFake Timer APIを利用することで時間に依存するコードを柔軟に且つ短時間でテストすることができる。

Fake Timer API

Vitestでは、次のようにして時間を能動的にコントロールしたテストを記述することができる。

beforeEach(() => {
  vi.useFakeTimers();
});
afterEach(() => {
  vi.useRealTimers();
});
it("...", () => {
  // Arrange...
  // Act...
  vi.advanceTimersByTime(150);
  // Assert...
});

他にも多くのメソッドが提供されている。

https://vitest.dev/api/vi.html#fake-timers

他のフレームワークにおけるAPI

他のテストフレームワークでも同様の機能を提供しているものがある。

Jest Timer Mocks

Vitestと同様のAPIが提供されている。

https://jestjs.io/ja/docs/timer-mocks

jest.useFakeTimers();
it("...", () => {
  // Arrange...
  // Act...
  jest.advanceTimersByTime(1000);
  // Assert...
});

Playwright Clock API

PlaywrightではClock APIを利用することで時間を操作することが出来る。

https://playwright.dev/docs/api/class-clock

test("...", async ({ page }) => {
  // Arrange...
  await page.clock.install({ time: new Date("2001-01-01T00:00:00") });
  // Act...
  await page.clock.runFor("00:10");
  // Assert...
});