【问题标题】:Jest, test suites fail because server is not closing correctly开玩笑,测试套件失败,因为服务器没有正确关闭
【发布时间】:2021-10-17 16:33:49
【问题描述】:

我在每个测试文件中都有以下设置:

const supertest = require('supertest');
const app = require('../../app.run');

let request = null;
let server = null;


beforeAll((done) => {
    server = app.listen(done);
    request = supertest.agent(server);
});

afterAll((done) => {
    sequelize.close();
    server.close(done);
});

我的应用监听方法如下:

app.listen(process.env.APP_PORT, () => {
    logger.info('Server is running on port ' + process.env.APP_PORT);
});

module.exports = app;

现在,当我用 jest 运行所有测试时,服务器似乎没有正确关闭,因为我收到 EADDRINUSE 错误:

Test suite failed to run

    listen EADDRINUSE: address already in use :::8081

      32 | app.use('/api', require('./app.routes'));
      33 |
    > 34 | app.listen(process.env.APP_PORT, () => {
         |     ^
      35 |     logger.info('Server is running on port ' + process.env.APP_PORT);
      36 | });
      37 |

      at Function.listen (node_modules/express/lib/application.js:618:24)
      at Object.<anonymous> (app.run.js:34:5)
      at Object.<anonymous> (test/e2e/auth-controller.test.js:3:13)

这是一个测试示例:

it("should register a user", async () => {
    await request
        .post('/api/users/signup')
        .send({email, password, name, surname})
        .expect(200);

    const user = await User.findOne({where: {email}});
    expect(user.active_token).toBeNull();
    expect(user.enabled).toBeTruthy();
});

关于如何正确关闭服务器的任何想法?提前感谢您的帮助

【问题讨论】:

  • 为什么需要启动express server?
  • 我不需要,我很想为所有测试套件启动一次服务器,但我没有找到解决方案
  • 不要启动它,只要request = supertest.agent(app);
  • 不幸的是它不起作用它仍然尝试调用它两次
  • 您删除了server = app.listen(done); 行吗?

标签: node.js express jestjs supertest


【解决方案1】:

我看起来您没有正确分配服务器。我将假设您正在从 index.js 中提取信息,因此您的 index.js 应该如下所示。

const express = require('express');
const app = express();

//...

let port = process.env.PORT || 3000;
if (process.env.NODE_ENV === "test")
    port = 4000;

const server = app.listen(port, () => console.log(`Listening on port ${port}`));

module.exports = server;

然后在您的测试文件中,您的代码应包含以下内容:

const request = require('supertest');

let server;

describe('/your/path', () => {
    beforeEach(() => { 
        server =  require('/path/to/index.js');
    });
    afterEach(() => { 
        server.close(); 
    });

    it("should register a user", async () => {
        cont res = await request(server)
            .post('/api/users/signup')
            .send({
               email: 'myemail@mail.com',
               name: 'John Doe'
            });
        ...
        expect(res.status).toBe(200);
        ...
    });
});

尽量不要让事情复杂化。我建议你有一个用户模型,而不是像你那样输入数据。

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2018-02-13
    • 2018-12-17
    • 2019-02-15
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多