开玩笑地尝试多个服务器实例

时间:2019-03-31 11:51:02

标签: node.js mongodb jestjs supertest

好的,所以我一直在使用jest和supertest为我的node.js应用编写测试,对于第一个之后的每个测试套件,我都会收到一个错误Error: listen EADDRINUSE: address already in use :::3000,我相信这是因为它尝试在每个测试文件上启动服务器(我在*.test.js中有多个测试文件/tests

每个测试文件中描述测试之前的顶部看起来像这样

const request = require("supertest");
const app = require("../index.js"); // the express server

jest.setTimeout(30000);

let token;

beforeAll(done => {
  request(app)
    .post("/api/users/login")
    .send({
      email: "email here",
      password: "password here"
    })
    .end((err, response) => {
      token = response.body.data; // save the token!
      done();
    });
});

afterAll(done => {
  //logout() //Not implemented yet
  done();
});

/* Test starts here */

因此,我需要知道如何防止开玩笑尝试初始化服务器的多个实例?是否可以说所有这些代码都在预测试文件中运行?我可以添加一些到我的afterAll中以使其停止服务器的功能,所以当另一个测试启动时,我感觉很好吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

问题在这里

const app = require("../index.js"); // the express server

每次您尝试要求index.js进行技术复制时,都将index.js内部的所有代码粘贴到测试脚本中。

由于您同时运行多个测试文件,因此每个测试都会尝试在index.js中运行相同的代码

您可以阅读有关此http://fredkschott.com/post/2014/06/require-and-the-module-system/

的更多信息

答案 1 :(得分:0)

好的,因此,在每次启动时删除连接并根据@Omar Sherif的答案同时使用是一个有效的解决方法,我发现它不必要地复杂,但根据笑话的文档设置globalSetup也是一个不必要的麻烦。

我发现一个简单的解决方案如下:由于运行jest会在我的index.js文件夹中设置NODE_ENV进行测试,而不是让我的服务器监听不必要的网络端口,所以我添加了一个非常简单的if条件。

if (process.env.NODE_ENV !== "test") {
  app.listen(port, () => console.log(`Server Running on ${port}`));
}

这似乎可以解决问题。谢谢!