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

    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(...)
      })
    })