运行jest时尝试多次服务器示例

xmq68pz9  于 12个月前  发布在  Jest
关注(0)|答案(3)|浏览(144)

好吧,我一直在使用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 */

那么,我需要知道如何防止jest尝试初始化我的服务器的多个示例?是否可以说所有这些代码都在一个预测试文件中运行?有什么我可以添加到我的afterAll,使它停止服务器,所以当另一个测试开始,我很好?非常感谢。

z9zf31ra

z9zf31ra1#

问题就在这里

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/上阅读更多

ldxq2e6h

ldxq2e6h2#

好吧,虽然在每次启动时删除连接并同时使用@Omar Sherif的答案是一个有效的解决方案,但我发现它不必要地复杂,根据jest的文档设置globalSetup也是一个相当不必要的麻烦。
我发现的一个简单的解决方案如下:由于运行jest会在index.js文件夹中设置NODE_ENV进行测试,而不是让我的服务器监听网络端口,这是不必要的,我添加了一个非常简单的if条件。

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

这一招似乎奏效了。谢谢你,谢谢

ybzsozfc

ybzsozfc3#

您还可以让jest同步运行测试,以避免服务器被打开两次。调整package.json中的jest脚本以添加--runInBand。这种方式

"scripts": {
  "test": "jest --watchAll --runInBand"
},

这对我很有效!

相关问题