Jest: тестирование проблемы с process.env.PORT - PullRequest
0 голосов
/ 17 марта 2020

РЕДАКТИРОВАТЬ: после небольшой игры я понял, что проблема связана не с переменными процесса, а с тем фактом, что мой экземпляр сервера по какой-то причине выполняется только один раз. Я все еще изучаю, я буду держать сообщение обновленным.

Я пытаюсь получить 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;

1 Ответ

1 голос
/ 17 марта 2020

Причина, по которой мой тест не работал, заключается в том, что требуемые модули (require("../../index.js")) будут кэшироваться, следовательно, создается только один экземпляр сервера. Чтобы решить эту проблему, просто используйте:

beforeEach(() => jest.resetModules());
...