为什么 Jest 没有完成此节点测试中的异步操作?



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

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笑话愉快地结束
但当我使用fetchData2时,它会抱怨:

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

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

数据变量确实具有来自数据库查询的结果,API中更高级别的其他调用程序将解析查询并继续执行其他语句。

我试过:

  1. --detectOpenHandles标志,但它没有显示任何内容
  2. 如果是此处描述的问题,则对fetchData2进行预期通过
  3. 向CCD_ 7中的异步函数传递CCD_。它确实存在,但调用它并不能修复警告
  4. 向它投掷试跳/接球块

感谢您的帮助。

事物的版本:

  • 节点v11.1.0
  • "笑话":"^23.6.0">
  • "knex":"^0.15.2">

要强制关闭Jest而不是DB连接:

--forceExit

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

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

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

得到这些错误:

1.

工作进程未能正常退出,已被强制退出已退出。这可能是由于测试不正确而导致的泄漏拆除。尝试使用--detectOpenHandles运行以查找泄漏。

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

这通常意味着有一些异步操作在测试中停止。考虑运行Jest--detectOpenHandles来解决此问题。节点:内部/过程/承诺:246triggerUncaughtException(err,true/*fromPromise*/(;^

[未处理的PromiseRejection:此错误由引发在没有catch块的异步函数内部,或者通过拒绝未使用.catch((处理的promise。该promise被拒绝原因";错误:请求失败,状态代码为404"。]{代码:'ERR_UNHANDLED_REJECTION'}##[error]Cmd.exe已退出,代码为"1"。

全局设置和拆卸示例:

// setup.js
const knexConfiguration = require('../config/knex')[process.env.NODE_ENV];
const knex = require('knex');
const setup = async () => {
const client = knex(knexConfiguration)
await client.migrate.latest();
await client.destroy();
};
module.exports = setup;
// teardown.js
const knexConfiguration = require('../config/knex')[process.env.NODE_ENV];
const knex = require('knex');
const teardown = async () => {
const client = knex(knexConfiguration)
await client.migrate.rollback();
await client.destroy();
};
module.exports = teardown;

来源:

https://github.com/facebook/jest/issues/7287#issuecomment-510068325

另一个例子:

dbConnection.js

export default new Sequelize({...}); // The Sequelize instance.

some.spec.js

import dbConnection from './dbConnection';
const { SomeModel } = dbConnection.models;
describe('...', () => {
beforeEach(async () => {
await SomeModel.create({...});
});
...
});
afterAll(async done => {
// Closing the DB connection allows Jest to exit successfully.
dbConnection.close();
done();
});

https://github.com/facebook/jest/issues/7287#issuecomment-434058564

最新更新