≪ Today I learned. RSS購読
公開日
タグ
JavaScript
著者
ダーシノ(@bc_rikko)

Vitest(jest)でuseFakeTimers()を使うとPromiseが動かなくなる

以下のコードを実行すると`Error: Test timed out in 5000ms.」となる。

vi.useFakeTimers()

await waitFor(() => {
  ...
})

解決策: advanceTimersを設定する

// xxx.spec.ts
const user = userEvent.setup({
  advanceTimers: vi.advanceTimersByTime  // userEventにtimerをセット
})

beforeEach(() => {
  // ワークアラウンド!!
  // https://github.com/testing-library/user-event/issues/1115
  (globalThis as any).jest = {
    advanceTimersByTime: vi.advanceTimersByTime.bind(vi)
  }
  vi.useFakeTimers()
  vi.setSystemTime('2024-01-01T00:00:00')
})
afterEach(() => {
  vi.useRealTimers()
})

test('xxxx', async () => {
  await user.click(...)  // userEventの代わりに最初にsetupしたものを使う
  
  await waitFor(() => {
    expect(...).toBe(...)
  })
})