web-dev-qa-db-ja.com

JestがこのNodeテストで非同期操作を完了しないのはなぜですか?

次の簡単なテストセットアップがあります。

test('what did I do to deserve this', async () => {
  expect.assertions(1)

  const data = await fetchData() // or fetchData2 
  expect(data).toBe('peanut butter')
})

async function fetchData () {
  return "peanut butter"
}

async function fetchData2 () {
  return knex.select('name').from('foos')
}

fetchDataを使用すると、jestは問題なく終了します。
しかし、fetchData2を使用すると、次のように文句を言います。

テストの実行が完了した後、Jestは1秒で終了しませんでした。

これは通常、テストで停止されなかった非同期操作があることを意味します。この問題のトラブルシューティングを行うには、--detectOpenHandlesを指定してJestを実行することを検討してください。

データ変数にはdbクエリの結果が含まれており、APIの上位にある他の呼び出し元はクエリを適切に解決し、他のステートメントの実行を続行します。

私が試してみました:

  1. --detectOpenHandlesフラグが表示されますが、何も表示されません。
  2. fetchData2の期待パスを作成する ここで説明する問題
  3. done引数をtestの非同期関数に渡します。それは存在しますが、それを呼び出しても警告は修正されません。
  4. それにtry/catchブロックを投げる

これを幸せにするための助けをありがとう。

物事のバージョン:

  • ノードv11.1.0
  • "jest": "^ 23.6.0"
  • "knex": "^ 0.15.2"
4
blu

テストスイートの最後でknex.destroy()を呼び出して、接続プールを破棄する必要があります。

3
Mikael Lepistö

DB接続ではなくJestを強制的に閉じるには:

--forceExit

したがって、私のテストスクリプトは次のようになりました。

"scripts": {
        "test": "jest --forceExit"
    }
4