Jestで非同期処理をテストする(コールバック)

fetchData関数は、第一引数に渡された値を第二引数に渡された関数の引数に渡して、3秒後に実行する関数です。

const fetchData = (value, cb) => {
  setTimeout(() => {
    cb(value)
  }, 3000)
}

fetchData関数の動作をチェックするテストを書いてみます。

test('fetchDataのテスト', () => {
  const testCallback = (value) => {
      expect(value).toBe(100)
  }

  fetchData(101, testCallback)
})

このコードでは実際に渡している値は101だが、期待する値は100なのでテストは失敗するはずですが、passします。

これは非同期処理を待たずにJestが終了するからです。

非同期処理を待ってもらう場合、test関数の引数にdoneを渡して、expectの後に実行します。

test('fetchDataのテスト', done => {
  const testCallback = (value) => {
      expect(value).toBe(101)
      done()
  }

  fetchData(100, testCallback)
})

このようにすることで、Jestはdoneが実行されるまでテストを待ってくれるようになります。