代码之家  ›  专栏  ›  技术社区  ›  devamat

笑话:过程的测试问题。环境。港口城市

  •  0
  • devamat  · 技术社区  · 6 年前

    编辑:在玩了一会儿之后,我意识到问题与流程变量无关,而是与我的服务器实例由于某种原因只执行了一次这一事实有关。我还在调查,我会随时更新帖子。

    我试图获得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();
      });
    
    });
    

    基本上,这两个测试中只有一个会运行。我做错了什么?

    指数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;
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   devamat    6 年前

    我的测试不起作用的原因是模块需要( require("../../index.js") )将被缓存,因此只创建服务器的一个实例。要解决这个问题,只需使用:

    beforeEach(() => jest.resetModules());
    
    推荐文章