Экземпляры сервера, шутки и 'слушай EADDRINUSE ::: 3000' - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в jest, node и express, и у меня возникла проблема с тестированием моего приложения.

Реальный код, кажется, работает - это просто при передаче экземпляра сервера в каждый из тестовых файлов (user.test.js и genres.test.js) и работает jest, порт блокируется.Я предполагаю, что это потому, что я создаю дубликаты экземпляров сервера в каждом тестовом файле, не осознавая этого.

Запуск jest с флагом --runInBand работает, как и использование только одного тестового файла, но это нене поможет мне точно понять, что происходит.

Я разместил пример кода ниже, но я изо всех сил стараюсь его сократить, однако я думаю, что большая часть кода не имеет значения, и это простокак я передаю сервер каждому файлу.

Опять же, извиняюсь за длину, но я думаю, что это должно быть очень просто для всех, кроме меня!Спасибо.


index.js (.)

const express = require('express');
const app = express();
const genres = require('./routes/genres');
const users = require('./routes/users');
app.use(express.json());
app.use('/api/genres', genres);
app.use('/api/users', users);

const port = process.env.PORT || 3000;

const server = app.listen(port, () => console.log(`Listening on port ${port}...`));
console.log(typeof server);
// export server to be used in test file
module.exports = server;

genres.js (./routes)

const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {
    res.send('post genre ok');
});

module.exports = router;

users.js (./routes)

const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {
    res.send('post user ok');
});

module.exports = router;

genres.test.js (./tests)

const request = require('supertest');

let server;

describe('auth tests', () => {

    const exec = async function(){
        return await request(server)
            .post('/api/genres');
    };

    beforeEach(() => {
        server = require('../index');
    });
    afterEach(async () => {
        await server.close();
    });

    describe('POST /', () => {
        it('should return 200', async () => {
            const res = await request(server).post('/api/genres');
            expect(res.status).toBe(200);
        });
    });
});

user.test.js (./tests)

const request = require('supertest');

let server;

describe('user tests', () => {

    const exec = async function(){
        return await request(server)
            .post('/api/user');
    };

    beforeEach(() => {
        server = require('../index');
    });
    afterEach(async () => {
        await server.close();
    });

    describe('POST /', () => {
        it('should return 200', async () => {
            const res = await request(server).post('/api/users');
            expect(res.status).toBe(200);
        });
    });
});

1 Ответ

0 голосов
/ 10 декабря 2018

Надеюсь этот (пункт 2) помогает другим в этом вопросе

Это сработало для меня, отделив приложение от сервера.Я не уверен, что это правильный подход, и я не уверен на 100%, почему он работает с приложением, а не с сервером, но все мои тесты сейчас проходят.

index.js сейчасapp.js:

const express = require('express');
const app = express();
const genres = require('./routes/genres');
const users = require('./routes/users');
app.use(express.json());
app.use('/api/genres', genres);
app.use('/api/users', users);

// export server to be used in test file
module.exports = app;

Сервер разделен на другой файл:

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

const port = process.env.PORT || 3000;

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

, и затем тестовые файлы импортируют приложение, а не сервер.поэтому каждый тест не создает свой собственный экземпляр.

Примечание: я думаю, - я действительно не знаю, насколько это правильно, но, как уже упоминалось, он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...