Завершение работы http-сервера Node.js в модульном тесте

Предположим, у меня есть несколько модульных тестов, которые тестируют веб-сервер. По причинам, которые я не хочу обсуждать здесь (вне рамок;-)), для каждого теста требуется только что запущенный сервер.

Пока я не отправляю запрос на сервер, все в порядке. Но как только я это сделаю, вызов на http-сервер close функция работает не так, как ожидалось, так как все сделанные запросы приводят к поддержанию соединений в рабочем состоянии, поэтому сервер ждет 120 секунд перед тем, как фактически закрыться.

Конечно, это не приемлемо для запуска тестов.

На данный момент я видел только одно решение:

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

Любые другие идеи о том, как справиться с этой ситуацией?

PS: меня спросили, как мне немедленно завершить работу http-сервера Node.js? Некоторое время назад и нашел эффективный способ обойти это, но, как кажется, этот обходной путь не работает надежно в каждом случае, так как время от времени я получаю странные результаты.

1 ответ

function createOneRequestServer() {
    var server = http.createServer(function (req, res) {
        res.write('write stuff');
        res.end();
        server.close();
    }).listen(8080);
}

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

var child = fork('serverModuleYouWishToTest.js');

function callback(signalCode) {
    child.kill(signalCode);
}

runYourTest(callback);

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

Другие вопросы по тегам