[英]Why doesn't Jest complete the async operation(s) in this Node test?
我有以下简单的测试设置:
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 一秒钟都没有退出。
这通常意味着在您的测试中没有停止异步操作。 考虑使用
--detectOpenHandles
运行 Jest 来解决此问题。
数据变量确实具有 db 查询的结果,API 中更高级别的其他调用者可以很好地解析查询并继续执行其他语句。
我试过了:
--detectOpenHandles
标志,但它没有显示任何内容。fetchData2
进行期望传递,以防它是此处描述的问题done
arg 传递给test
的 async 函数。 它确实存在,但调用它并不能修复警告。感谢您提供的任何帮助,让这一切变得快乐。
事物的版本:
您需要在测试套件的末尾调用knex.destroy()
来拆除连接池。
要强制关闭Jest而不是DB Connection:
--forceExit
所以我的测试脚本看起来像这样,
"scripts": {
"test": "jest --forceExit"
}
得到这些错误:
1.
工作进程未能正常退出并已被强制退出。 这很可能是由于拆卸不当导致测试泄漏造成的。 尝试使用 --detectOpenHandles 运行以查找泄漏。
测试运行完成后,Jest 一秒钟都没有退出。
这通常意味着在您的测试中没有停止异步操作。 考虑使用
--detectOpenHandles
运行 Jest 来解决此问题。 node:internal/process/promises:246 triggerUncaughtException(err, true /* fromPromise */); ^[UnhandledPromiseRejection:这个错误要么是因为在没有 catch 块的情况下抛出异步函数内部,要么是因为拒绝了一个没有用 .catch() 处理过的承诺。 承诺被拒绝,原因是“错误:请求失败,状态码为 404”。] { code: '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
另一个例子:
数据库连接.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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.