使用简单的 Express 应用程序完成测试 运行 后 Jest 测试没有退出(一秒)
Jest tests did not exit (one second) after the test run has completed using a simple Express application
我有一个公开 RESTful API 的简单 Express
应用程序。它使用 Knex
和 Objection
访问数据库,使用 Jest
/ Supertest
测试 API.
我有一个启动服务器的测试,从给定路由获取可用数据并断言接收到的值。一切正常,除了 Jest
在执行此测试后从未退出。
这是我的测试:
import { app } from "../../src/application.js";
import { describe, expect, test } from "@jest/globals";
import request from "supertest";
describe("Customer Handler", () => {
test("should retrieve all existing customer(s)", async () => {
const expected = [
// ...real values here; omitted for brevity
];
const response = await request(app).get(`/api/customers`);
expect(response.statusCode).toStrictEqual(200);
expect(response.headers["content-type"]).toContain("application/json");
expect(response.body).toStrictEqual(expected);
});
});
application.js
文件看起来很像普通的 Express
setup/configuration 文件:
import { CustomerHandler } from "./handler/customer.handler.js";
import connection from "../knexfile.js";
import express from "express";
import Knex from "knex";
import { Model } from "objection";
const app = express();
Model.knex(Knex(connection[process.env.NODE_ENV]));
// ...removed helmet and some other config for brevity
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/api/customers", CustomerHandler);
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.json({
errors: {
error: err,
message: err.message,
},
});
next();
});
export { app };
我已经尝试 --detectOpenHandles
,但是控制台中没有打印任何其他内容,所以我看不到任何关于问题可能是什么的提示 — 我怀疑是 Knex
/ Objection
因为我正在使用 SQLite
,所以可能与数据库的连接没有关闭。
In the meantime I'm using --forceExit
, but I would like to figure it out why is Jest
not able to exit.
好的,看起来我在这方面的方向是正确的。
重构 application.js
导出 Knex
对象(配置后),并在测试通过后调用 knex.destroy()
是此设置的解决方案。
// application.js
...
const knex = Knex(connection[process.env.NODE_ENV]);
Model.knex(knex);
...
export { app, knex };
...然后在测试中,确保导入 knex
并调用 destroy()
:
// customer.handler.test.js
import { app, knex } from "../../src/application.js";
import { afterAll, describe, expect, test } from "@jest/globals";
import request from "supertest";
describe("Customer Handler", () => {
afterAll(async () => {
await knex.destroy();
});
test("should retrieve all existing customer(s)", async () => {
const expected = [ /* ...real values here */ ];
...
expect(response.body).toStrictEqual(expected);
});
});
我有一个公开 RESTful API 的简单 Express
应用程序。它使用 Knex
和 Objection
访问数据库,使用 Jest
/ Supertest
测试 API.
我有一个启动服务器的测试,从给定路由获取可用数据并断言接收到的值。一切正常,除了 Jest
在执行此测试后从未退出。
这是我的测试:
import { app } from "../../src/application.js";
import { describe, expect, test } from "@jest/globals";
import request from "supertest";
describe("Customer Handler", () => {
test("should retrieve all existing customer(s)", async () => {
const expected = [
// ...real values here; omitted for brevity
];
const response = await request(app).get(`/api/customers`);
expect(response.statusCode).toStrictEqual(200);
expect(response.headers["content-type"]).toContain("application/json");
expect(response.body).toStrictEqual(expected);
});
});
application.js
文件看起来很像普通的 Express
setup/configuration 文件:
import { CustomerHandler } from "./handler/customer.handler.js";
import connection from "../knexfile.js";
import express from "express";
import Knex from "knex";
import { Model } from "objection";
const app = express();
Model.knex(Knex(connection[process.env.NODE_ENV]));
// ...removed helmet and some other config for brevity
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/api/customers", CustomerHandler);
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.json({
errors: {
error: err,
message: err.message,
},
});
next();
});
export { app };
我已经尝试 --detectOpenHandles
,但是控制台中没有打印任何其他内容,所以我看不到任何关于问题可能是什么的提示 — 我怀疑是 Knex
/ Objection
因为我正在使用 SQLite
,所以可能与数据库的连接没有关闭。
In the meantime I'm using
--forceExit
, but I would like to figure it out why isJest
not able to exit.
好的,看起来我在这方面的方向是正确的。
重构 application.js
导出 Knex
对象(配置后),并在测试通过后调用 knex.destroy()
是此设置的解决方案。
// application.js
...
const knex = Knex(connection[process.env.NODE_ENV]);
Model.knex(knex);
...
export { app, knex };
...然后在测试中,确保导入 knex
并调用 destroy()
:
// customer.handler.test.js
import { app, knex } from "../../src/application.js";
import { afterAll, describe, expect, test } from "@jest/globals";
import request from "supertest";
describe("Customer Handler", () => {
afterAll(async () => {
await knex.destroy();
});
test("should retrieve all existing customer(s)", async () => {
const expected = [ /* ...real values here */ ];
...
expect(response.body).toStrictEqual(expected);
});
});