为什么 Jest 在这个 Node 测试中没有完成异步操作?

blu*_*blu 8 node.js knex.js jestjs

我有以下简单的测试设置:

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')
}
Run Code Online (Sandbox Code Playgroud)

使用fetchData玩笑的话愉快地结束。
但是当我使用fetchData2它时会抱怨这个:

测试运行完成后,Jest 一秒钟都没有退出。

这通常意味着在您的测试中没有停止异步操作。考虑运行 Jest --detectOpenHandles来解决这个问题。

数据变量确实具有 db 查询的结果,API 中更高级别的其他调用者可以很好地解析查询并继续执行其他语句。

我试过了:

  1. --detectOpenHandles标志,但它不显示我什么。
  2. fetchData2如果是此处描述的问题,则进行期望通过
  3. donearg传递给test. 它确实存在,但调用它并不能修复警告。
  4. 向它抛出 try/catch 块

感谢您提供的任何帮助,让这一切变得快乐。

事物的版本:

  • 节点 v11.1.0
  • “开玩笑”:“^23.6.0”
  • "knex": "^0.15.2"

小智 10

强行关闭 Jest 而不是 DB Connection :

--forceExit
Run Code Online (Sandbox Code Playgroud)

所以我的测试脚本看起来像这样,

"scripts": {
        "test": "jest --forceExit"
    }
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但现在我看到:“强制退出 Jest:您是否考虑过使用 `--detectOpenHandles` 来检测所有测试完成后继续运行的异步操作?” (4认同)

Mik*_*stö 6

您需要knex.destroy()在测试套件的末尾调用以拆卸连接池。