笑话:process.env.PORT 的测试问题
Jest: Testing issue with process.env.PORT
编辑:经过一番尝试后,我意识到这个问题与流程变量无关,而是因为我的服务器实例由于某种原因只执行了一次。我仍在研究它,我会保持 post 更新。
我试图获得 100% 的覆盖率,但我一直在测试这条线:
const port = config.get("port") || process.env.PORT || 3000;
看来我不能设置process.env.PORT
不止一次
const config = require("config");
// This checks if a port is being used
function portUsed(port) {
return new Promise((resolve, reject) => {
const net = require("net");
const server = net.createServer();
server.once("error", err => {
if (err.code === "EADDRINUSE") {
resolve(true);
}
});
server.once("listening", () => {
server.close();
resolve(false);
});
server.listen(port);
});
}
describe("index", () => {
// this works
it("should use process.env.PORT if config.get('port') is not set", async () => {
config.port = null;
process.env.PORT = 3333;
const server = require("../../index");
const result = await portUsed(3333);
expect(result).toBe(true);
await server.close();
});
// This does not work, but if you comment out / remove the previous test, it will work!
it("should default to port 3000 if other variables are not set", async () => {
config.port = null;
delete process.env.PORT;
const server = require("../../index");
const result = await portUsed(3000);
expect(result).toBe(true);
await server.close();
});
});
基本上这两个测试中只有一个会 运行。我做错了什么?
index.js
const express = require("express");
const app = express();
const config = require("config");
const logger = require("./startup/logging");
require("./startup/console")(app);
require("./startup/database")();
require("./startup/routes")(app);
app.use(express.urlencoded({ extended: true }));
logger.info(config.get("name"));
// delete config.port;
// delete process.env.PORT;
// console.log("config", config.port);
console.log("server", process.env.PORT);
const port = config.get("port") || process.env.PORT || 3000;
const server = app.listen(port, () => logger.info(`Listening on port ${port}.`));
module.exports = server;
我的测试失败的原因是因为所需的模块 (require("../../index.js")
) 将被缓存,因此只创建了一个服务器实例。要解决这个问题,只需使用:
beforeEach(() => jest.resetModules());
编辑:经过一番尝试后,我意识到这个问题与流程变量无关,而是因为我的服务器实例由于某种原因只执行了一次。我仍在研究它,我会保持 post 更新。
我试图获得 100% 的覆盖率,但我一直在测试这条线:
const port = config.get("port") || process.env.PORT || 3000;
看来我不能设置process.env.PORT
不止一次
const config = require("config");
// This checks if a port is being used
function portUsed(port) {
return new Promise((resolve, reject) => {
const net = require("net");
const server = net.createServer();
server.once("error", err => {
if (err.code === "EADDRINUSE") {
resolve(true);
}
});
server.once("listening", () => {
server.close();
resolve(false);
});
server.listen(port);
});
}
describe("index", () => {
// this works
it("should use process.env.PORT if config.get('port') is not set", async () => {
config.port = null;
process.env.PORT = 3333;
const server = require("../../index");
const result = await portUsed(3333);
expect(result).toBe(true);
await server.close();
});
// This does not work, but if you comment out / remove the previous test, it will work!
it("should default to port 3000 if other variables are not set", async () => {
config.port = null;
delete process.env.PORT;
const server = require("../../index");
const result = await portUsed(3000);
expect(result).toBe(true);
await server.close();
});
});
基本上这两个测试中只有一个会 运行。我做错了什么?
index.js
const express = require("express");
const app = express();
const config = require("config");
const logger = require("./startup/logging");
require("./startup/console")(app);
require("./startup/database")();
require("./startup/routes")(app);
app.use(express.urlencoded({ extended: true }));
logger.info(config.get("name"));
// delete config.port;
// delete process.env.PORT;
// console.log("config", config.port);
console.log("server", process.env.PORT);
const port = config.get("port") || process.env.PORT || 3000;
const server = app.listen(port, () => logger.info(`Listening on port ${port}.`));
module.exports = server;
我的测试失败的原因是因为所需的模块 (require("../../index.js")
) 将被缓存,因此只创建了一个服务器实例。要解决这个问题,只需使用:
beforeEach(() => jest.resetModules());