почему сервер уже работает на порте 4000, даже если я закрыл сервер - PullRequest
0 голосов
/ 07 ноября 2019

Я запускаю модульное тестирование с моим проектом узла с использованием библиотеки Jest, все работало довольно хорошо. Когда я создал новый тест для проверки подлинности маршрута, он начинает показывать, что сервер уже работает на порте 4000, даже если я использую функцию afterEach (), чтобы закрыть подачу, но не знаю, почему все еще получается, что сервер уже работает на порту 4000.

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

Воткод в пользовательском тестовом файле, где корректно закрывается сервер, и в следующем тестовом файле я снова использую те же функции для подключения и закрытия сервера.

const request = require("supertest");
const { Genre } = require("../../models/genre");
const { User } = require("../../models/user");
const mongoose = require("mongoose");

let server;

describe("/api/genres", () => {
  beforeEach(() => {
    server = require("../../index");
  });
  afterEach(async () => {
    server.close();
    await Genre.remove({});
  });

код второго тестового файла

const { User } = require("../../models/user");
const { Genre } = require("../../models/genre");
const request = require("supertest");
describe("auth middleware", () => {
  beforeEach(() => {
    server = require("../../index");
  });
  afterEach(async () => {
    await Genre.remove({});
    server.close();
  });

Вот вывод ............................ ● промежуточное ПО auth ›должно возвращать 401, если токен не предоставлен

listen EADDRINUSE: address already in use :::4000

  10 | 
  11 | const port = process.env.PORT || 4000;
> 12 | const server = app.listen(port, () =>
     |                    ^
  at Function.listen (node_modules/express/lib/application.js:618:24)
  at Object.<anonymous> (index.js:12:20)
  at Object.<anonymous> (tests/integration/auth.test.js:6:14)

Наборы тестов: 1 не пройден, 3 пройден, всего 4 теста*

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

require("./startup/logging")();
require("./startup/routes")(app);
require("./startup/db")();
require("./startup/config")();
require("./startup/validation")();

const port = process.env.PORT || 4000;
const server = app.listen(port, () =>
  winston.info(`Listening on port ${port}...`)
);
module.exports = server;

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Я не эксперт в Node.js, но природа вашей ошибки очень проста;вы пытаетесь прослушивать порт, который уже прослушивается.

В этом сообщении содержится подробное описание require(), которое, по моему мнению, является источником вашей проблемы.

Вызывая require("../../index") в каждой из ваших тестовых программ, вы эффективно экспортируете сервер дважды , что приводит к двум app.listen() вызовам.

Вы будете бесконечнолучше экспортировать свой сервер один раз в какую-нибудь основную тестовую программу, в которой вы могли бы затем запустить все свои тестовые случаи, вызвав require() для каждого из тестовых файлов. Этот подход намного лучше в долгосрочной перспективе, потому что добавление дополнительных тестовых примеров будет в 1000 раз легче;Вы можете просто написать новый сценарий тестирования, экспортировать его в основную программу тестирования и добавить его в свой список тестов.

0 голосов
/ 07 ноября 2019

Ваш тест создает сервер (index.js) несколько раз. Это заставляет сервер пытаться прослушивать один и тот же порт во многих случаях. Документация Jest гласит:

Если у вас есть какая-то работа, которую вам нужно делать многократно для многих тестов, вы можете использовать beforeEach и afterEach.

Очевидно, что вам следуетсоздайте сервер один раз, сделайте все тесты и закройте его один раз. Методы для этого beforeAll и afterAll.

В некоторых случаях вам нужно выполнить настройку только один раз, в начале файла. Это может быть особенно утомительно, когда установка асинхронна, поэтому вы не можете сделать это встроенным. Jest предоставляет до и после и все для обработки этой ситуации.

Итак, ваш тест должен выглядеть так:

describe("auth middleware", () => {
  beforeAll(() => {
    server = require("../../index");
  });
  afterAll(async () => {
    await Genre.remove({});
    server.close();
  });
...