Как создать / закрыть сервер при запуске интеграционных тестов с использованием Express и Supertest в NodeJS - PullRequest
0 голосов
/ 26 октября 2019

Моя проблема в том, что я всегда получаю ошибку "Address already in use::3000" при выполнении моих тестов.

Вот что у меня есть:

package.json

................
  "scripts": {
    "test": "jest --watchAll --verbose --runInBand --maxWorkers=1"
  },
................

server.js

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

module.exports = function() {
    const port = process.env.PORT || 3000;

    return app.listen(port, () => { winston.info(`Listening on port ${port}...`) });
}

auth.test.js (показывается только один тест)

describe('auth middleware', () => {
    beforeEach(() => { server = require('../../startup/server'); });
    afterEach(async () => { 
        await Category.remove({});
        await server.close(); 
    });

    let token;

    const exec = () => {
        return request(server)
            .post('/api/categories')
            .set('x-auth-token', token)
            .send({ name: 'category1' });
    }

    beforeEach(() => {
        token = new User().generateAuthToken();
    });

    it('should return 200 if token is valid', async () => {
        const res = await exec();

        expect(res.status).toBe(200);
    });
});

Я довольно новичок в NodeJS или Javascript, поэтому я не уверен, что делаю неправильно, большинство ответов по стеку указывают на добавление runInBand или maxWorkers=1 к package.json или ожидание server.close().
Ничто не работает для меня.

PS: у меня была эта проблема раньше с одним тестом, но после извлечения логики сервера в отдельный файл (из index.js), теперь все тесты не проходят с этой ошибкой, так что ясно, что яя что-то упускаю.
И я не запускаю приложение, только мои тесты.

...