[英]How to use Jest global Setup and Teardown in a nodeJS project?
我使用 jest 向我的 node.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;
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);
});
...
jest.config.js
module.exports = {
testEnvironment: "node",
};
試試這個 jest.config.js:
module.exports = {
testEnvironment: "node",
globalSetup: '<rootDir>/src/testSetup.ts'
};
在 testSetup.ts 中你可以這樣做:
// testSetup.ts
module.exports = async () => {
const app = require("../../app");
server = http.createServer(app);
server.listen(done);
};
我使用 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;
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);
});
...
jest.config.js
module.exports = {
testEnvironment: "node",
};
使用此配置: setupFiles: ['./tests/setup.js']
您的安裝文件應如下所示:
// setup.js
(async () => {
const app = require('../app.js')
global.app = app
})()
那么您將能夠在每個測試套件中全局使用app
我有同樣的問題,我想在所有測試文件之前建立一個數據庫連接,並在所有文件中的所有測試之后關閉連接。
但是....我沒有達到我想要的,也許我們不需要這樣做。
我找到了一個解決方案來啟動函數 beforeAll()、afterAll() 等......實際上是在所有測試文件之前和所有測試文件之后等。所以你在某個文件中定義這些函數一次,它們為每個測試文件運行。 為此,我們只需要創建一個 setupFile.ts 並在 jest.config 或 package.json "setupFilesAfterEnv": ["<rootDir>/__tests__/settings/setupTests.ts"],
中添加該文件的路徑
這是我的玩笑配置的示例。
"jest": {
"preset": "ts-jest",
"testEnvironment": "node",
"setupFilesAfterEnv": ["<rootDir>/__tests__/settings/setupTests.ts"],
"rootDir": "src",
"verbose": true,
"clearMocks": true,
"testMatch": [
"**/**/*.test.ts"
]
},
這是 setupFile.ts 的示例
import usersCollection from "../../database/user-schema";
import mongoose from "mongoose";
beforeAll(async () => {
try {
await mongoose.connect(process.env.MONGODB_URL!);
await usersCollection.deleteMany({});
} catch (error) {
console.log(error);
}
});
afterAll(async () => {
try {
await mongoose.disconnect();
} catch (error) {
console.log(error);
}
});
這意味着我們將在該文件中的所有測試之前為每個測試文件建立與數據庫的連接,並在每個測試文件中的所有測試之后關閉連接。
我對自己的認識:
在現實生活中,我們有很多測試文件,並不是每個文件都需要連接到數據庫。 在需要連接的文件中打開與數據庫的連接並在該文件中進行所有測試后關閉是完全沒問題的,例如當我們測試 API 端點時的集成測試。
在其他不使用真實數據庫進行許多單元測試的測試中,我們可以考慮模擬(模擬)數據庫。 這是另一個非常有趣的話題
如果我說錯了你可以糾正我
PS 我還想提一下 Mongoose 文檔中寫的內容
不要使用 globalSetup 調用 mongoose.connect() 或 mongoose.createConnection()。 Jest 在單獨的環境中運行 globalSetup,因此您不能在測試中使用在 globalSetup 中創建的任何連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.