尽管 done() 运行测试后开玩笑挂起



所有,我试图实现的是编写一个测试用例,该用例在传递某些有效凭据时检查有效的knex连接。以下测试用例执行正常,但在显示执行摘要后未完成执行。在消息"运行所有测试"后它卡住了,我必须显式传递退出命令。我正在调用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仅在文件中的所有内容之前(和之后(运行。如果要在所有测试(包括其他文件中的测试(之前进行设置,则需要将创建数据库客户端移动到全局安装文件。有关详细信息,请参阅全局设置。

最新更新