Jest 在 运行 测试后挂起,尽管完成了()

Jest hangs after running test despite done()

所有,我试图实现的是编写一个测试用例,在传递一些有效凭据时检查工作的 knex 连接。以下测试用例执行正常,但在显示执行摘要后未完成执行。它在消息 "ran all tests" 之后卡住了,我必须明确地传递 quit 命令。我正在调用 done() 但它永远不会完成。

import * as Knex from "knex";
let knexClient:Knex< any, unknown>; 

beforeAll(() => {
    knexClient = Knex({
      client: "mysql",
      connection: {
        host: "127.0.0.1",
        user: "root",
        password: "some_pwd",
        database: "some_db"
      }
    });
  });
describe("Ask for knex client with running db", () => {
  it("should return a working connection", (done) => {
   return knexClient.raw("select 1+1 as result").then((res:any)=>{
       console.log(typeof(res))
       done();
   })
  })
});

主要问题:我应该调整什么才能完成执行? 附带问题:此测试用例的异步版本是什么?

这通常是由于 Knex 保持与底层数据库进程的连接打开所致。您可以使用 afterAll 破坏连接,我已经包含了 async 版本以供比较:

import Knex from "knex";
import { test } from "../knexfile";

describe("Database stuff", () => {
  let knexClient: Knex;

  beforeAll(() => {
    knexClient = Knex(test as Knex.Config);
  });

  afterAll(() => {
    knexClient.destroy();
  });

  it("should work without hanging at the end of the test run", async () => {
    const promise = knexClient.raw("SELECT 1+1 AS result");

    // Because .raw returns a bunch of metadata, we need to do a little more
    // to match the result
    const expected = [{ result: 2 }];
    await expect(promise).resolves.toContainEqual(expected);
  });

  it("rejects if the table doesn't exist", () => {
    const promise = knexClient("non_existant_table");

    // This also works. Note `return` is required here
    return expect(promise).rejects.toThrowError(/doesn't exist/);
  });
});

几件事。首先,请注意,我已经从 knexfile.js 中获取了配置,这里假设它是您的测试文件的一个目录。

其次,beforeAllafterAll 仅 运行 在 文件 中的所有内容之前(和之后)。如果您想要在所有 测试 之前进行设置,包括其他文件中的那些,您需要将创建数据库客户端移到全局设置文件中。有关详细信息,请参阅 globalSetup