在使用简单的express应用程序完成测试运行后,jest测试没有退出(一秒钟)

nom7f22z  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(482)

我有一个简单的问题 Express 公开restful api的应用程序。它使用 KnexObjection 访问数据库,以及 Jest / Supertest 用于测试api。
我有一个测试,它启动服务器,从给定的路由获取可用数据,并Assert接收到的值。除了那个,一切都很好 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 安装/配置文件:

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 ,因此与数据库的连接可能没有关闭。
与此同时,我正在使用 --forceExit ,但我想弄清楚为什么 Jest 无法退出。

jw5wzhpr

jw5wzhpr1#

好吧,看来我这次选对了。
重构 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);
  });
});

相关问题