Шутка, наборы тестов выходят из строя, потому что сервер закрывается неправильно

#node.js #express #jestjs #supertest

Вопрос:

У меня есть следующие настройки в каждом из моих тестовых файлов:

 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();
});
 

Есть идеи о том, как правильно закрыть сервер? Заранее спасибо за вашу помощь

Комментарии:

1. Зачем вам нужно запускать экспресс — сервер?

2. Мне это не нужно, я бы с удовольствием запустил сервер один раз для всех наборов тестов, но я не нашел решения

3. Не начинай это, просто request = supertest.agent(app);

4. к сожалению, это не работает, он все еще пытается вызвать его дважды

5. вы удалили server = app.listen(done); линию?

Ответ №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);
        ...
    });
});
 

Постарайтесь не усложнять ситуацию. Я бы посоветовал вам иметь ПОЛЬЗОВАТЕЛЬСКУЮ МОДЕЛЬ вместо ввода данных, как вы это делали.