繁体   English   中英

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

[英]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 中更高级别的其他调用者可以很好地解析查询并继续执行其他语句。

我试过了:

  1. --detectOpenHandles标志,但它没有显示任何内容。
  2. fetchData2进行期望传递,以防它是此处描述的问题
  3. done arg 传递给test的 async 函数。 它确实存在,但调用它并不能修复警告。
  4. 向它抛出 try/catch 块

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

事物的版本:

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

您需要在测试套件的末尾调用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.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM