Несколько попыток экземпляра сервера во время запуска jest - PullRequest
0 голосов
/ 31 марта 2019

Хорошо, я пишу тесты для своего приложения node.js, используя jest и supertest, для каждого набора тестов после первого я получаю сообщение об ошибке Error: listen EADDRINUSE: address already in use :::3000, я думаю, это потому, что оно пытается запустить сервер на каждом тестовом файле (у меня есть несколько тестовых файлов *.test.js в /tests)

Верхняя часть описания тестов в каждом файле теста выглядит примерно так

const request = require("supertest");
const app = require("../index.js"); // the express server

jest.setTimeout(30000);

let token;

beforeAll(done => {
  request(app)
    .post("/api/users/login")
    .send({
      email: "email here",
      password: "password here"
    })
    .end((err, response) => {
      token = response.body.data; // save the token!
      done();
    });
});

afterAll(done => {
  //logout() //Not implemented yet
  done();
});

/* Test starts here */

Итак, мне нужно знать, как предотвратить попытки jest инициализировать несколько экземпляров моего сервера? Можно ли сказать, что весь этот код выполняется в файле предварительного тестирования или около того? Есть ли что-то, что я могу добавить к своему afterAll, чтобы он остановил сервер, поэтому, когда запускается другой тест, я в порядке? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

проблема здесь

const app = require("../index.js"); // the express server

Каждый раз, когда вы пытаетесь потребовать index.js, который вы технически копируете, вставьте весь код из index.js в ваш тестовый скрипт.

Поскольку вы запускаете несколько тестовых файлов одновременно, каждый тест пытается запустить один и тот же код внутри index.js

Вы можете прочитать больше об этом http://fredkschott.com/post/2014/06/require-and-the-module-system/

0 голосов
/ 31 марта 2019

Хорошо, так что, хотя удаление соединения при каждом запуске и одновременное использование для @Omar, ответ Шерифа был допустимым обходным путем, я нашел его излишне сложным, настройка globalSetup для документации шутки также была довольно ненужной проблемой.

Простое решение, которое я нашел, было следующим;Так как запуск jest устанавливает NODE_ENV для проверки, в моей папке index.js вместо того, чтобы мой сервер прослушивал сетевой порт, который был ненужным, я добавил очень простое условие if.

if (process.env.NODE_ENV !== "test") {
  app.listen(port, () => console.log(`Server Running on ${port}`));
}

Казалось, это сработало.Спасибо!

...