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

    VitestでPromiseを返すメソッドのテストで警告が出る

    Promise returned by expect(actual).resolves.toEqual(expected) was not awaited. Vitest currently auto-awaits hanging assertions at the end of the test, but this will cause the test to fail in Vitest 3. Please remember to await the assertion.

    VitestでPromiseを返すメソッドをテストするときに、上記のような警告がでる。要約すると「Vitest@2では自動でawaitするけど、Vitest@3になったら失敗するよ」という内容。

    問題のテストコード

    test('Promiseを返すメソッドをテストする', () => {
      const fetchList = async () => {
        return new Promise((resolve) => {
          resolve([
            { item: 'test1' },
            { item: 'test2' },
          ])
        })
      }
    
      expect(fetchList()).resolves.toHaveLength(2)
    })

    解決策

    expect().resolvesexpect().rejectsを使うと、続くテストメソッドがPromise<void>を返すようになるため、expectの前にawaitをつけることで警告が解消できる。

    test('Promiseを返すメソッドをテストする', async () => {
      const fetchList = async () => {
        return new Promise((resolve) => {
          resolve([
            { item: 'test1' },
            { item: 'test2' },
          ])
        })
      }
    
      await expect(fetchList()).resolves.toHaveLength(2)
    })