如何在 nodeJS 项目中使用 Jest 全局设置和拆卸?

Emz*_*Emz 6 javascript integration-testing node.js express jestjs

我使用 jest 向我的节点 js 项目添加了测试,但对于每个测试套件,都有一个 beforeAll 方法创建一个新的测试服务器并连接到一个 mongo 数据库和一个 afterAll 方法关闭测试服务器和数据库。我想为所有测试套件全局执行上述任务,而不是一次一个。下面是我的代码示例。

应用程序.js

const express = require("express");
const app = express();
const { connectToDb } = require("./startup/db");
require("./startup/routes")(app);
connectToDb();
...

const port = process.env.PORT || 3000;

if (process.env.NODE_ENV !== "test") {
  app.listen(port, () => winston.info(`Listening on port ${port}...`));
}

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

auth.test.js

const request = require("supertest");
const http = require("http");
const { disconnectDb } = require("../../startup/db");

describe("auth middleware", () => {
  let server;

  beforeAll((done) => {
    const app = require("../../app");
    server = http.createServer(app);
    server.listen(done);
  });

  afterAll((done) => {
    server.close(done);
    disconnectDb();
  });

  it("should return 401 if no token is provided", async () => {
    const res = request(server)
      .post("/api/genres")
      .set("x-auth-token", "")
      .send({ name: "genre1" });
    expect(res.status).toBe(401);
  });

...
Run Code Online (Sandbox Code Playgroud)

开玩笑的配置文件

module.exports = {
  testEnvironment: "node",
};
Run Code Online (Sandbox Code Playgroud)

Ale*_*dru 5

试试这个 jest.config.js:

module.exports = {
  testEnvironment: "node",
  globalSetup: '<rootDir>/src/testSetup.ts'
};
Run Code Online (Sandbox Code Playgroud)

在 testSetup.ts 中,您可以执行以下操作:

// testSetup.ts
module.exports = async () => {
    const app = require("../../app");
    server = http.createServer(app);
    server.listen(done);
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,从版本 29.5 开始:“仅当您从该项目运行至少一个测试时,才会触发项目中配置的全局设置模块(使用多项目运行器)。通过 globalSetup 定义的任何全局变量只能在globalTeardown。您无法检索测试套件中此处定义的全局变量。” 【配置Jest·Jest】(https://jestjs.io/docs/configuration#globalsetup-string) (2认同)