Завершение работы 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% независимыми.