Jest обнаружил следующие 2 открытых дескриптора, которые потенциально не позволяют Jest выйти:

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

Оба файла, которые я пишу, чтобы проверить

const supertest = require('supertest');
const app = require('../index');
describe('API Testing for APIs', () => {
  it('Healthcheck endpoint', async () => {
    const response = await supertest(app).get('/healthcheck');
    expect(response.status).toBe(200);
    expect(response.body.status).toBe('ok');
  });
});

Как я могу разделить свой тест на разные файлы, чтобы лучше организовать свои тесты, или есть ли способ организовать тестовые файлы.

PS - пожалуйста, предложите, как лучше всего писать тесты API NodeJS.


person Mukul Munjal    schedule 02.06.2020    source источник
comment
Вы используете Экспресс? Не могли бы вы предоставить index.js, пожалуйста¡   -  person Andrés Muñoz    schedule 02.06.2020
comment
Да, я использую экспресс. В index.js я просто запускаю сервер на порту и экспортирую его module.exports = server;   -  person Mukul Munjal    schedule 02.06.2020
comment
Отлично, не могли бы вы предоставить файл index.js?   -  person Andrés Muñoz    schedule 02.06.2020
comment
const server = http.createServer((req, res) =› { if (err) { return console.error(err); } console.log(Listening on port ${server.address().port}); });   -  person Mukul Munjal    schedule 02.06.2020
comment
Похоже, вы используете не Express, а модуль узла http.   -  person Andrés Muñoz    schedule 02.06.2020


Ответы (1)


Когда вы используете Express с Jest и Supertest, вам нужно разделить в двух разных файлах ваше определение приложения Express и прослушивание приложения. Супертест не работает ни на одном порту. Он имитирует ответ HTTP-запроса на ваше приложение Express. Это будет примерно так:

Файл: app.js

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

app.get('/healthcheck', (req, res) => {
    res.json({msg: 'Hello!'});
};

module.exports = app;

Файл: index.js

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

Файл: index.test.js

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

test('Health check', async () => {
    const response = await request(app)
        .get('/healthcheck')
        .send()
        .expect(200);

   expect(response.body.msg).toBe('Hello!');
};
person Andrés Muñoz    schedule 02.06.2020
comment
мой вопрос: мне нужно разделить два тестовых файла, чтобы сделать мои тесты более организованными. Если у меня есть все тесты в одном файле, он работает нормально - person Mukul Munjal; 02.06.2020
comment
У вас возникают ошибки занятого порта, поэтому вам нужно разделить сервер приложений с определением вашего сервера и методом прослушивания. Когда ваш набор тестов, наконец, запустится без ошибок, рекомендуется создать по одному тестовому файлу для каждого модуля. - person Andrés Muñoz; 02.06.2020
comment
Хорошо, понял. в любом случае, в шутку он будет запускать один файл за другим, и после запуска одного файла он закроет сервер и снова откроется при переходе к следующему файлу - person Mukul Munjal; 02.06.2020
comment
Насколько я знаю, нет. В Jest тесты распараллелены за счет их запуска в отдельных процессах, чтобы максимизировать производительность. jestjs.io/en - person Andrés Muñoz; 02.06.2020