2013-07-26 3 views
2

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

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

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

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

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

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

PS: Я был спросил How do I shutdown a Node.js http(s) server immediately? некоторое время назад, и нашли жизнеспособный способ работать вокруг него, но, как кажется, этот способ действительно надежно не работает в любом случае, как я получаю странные результаты, время от времени ,

+1

Как вы начинаете сервер в первую очередь? Вы используете сервер node.js из узла или из другого скрипта? – jsalonen

+0

Также я понимаю, что у вас могут быть строгие требования, но вам действительно нужно перезагрузить сервер после каждого теста? Я имею в виду, вы могли бы реорганизовать что-то таким образом, чтобы вы могли запускать несколько тестов на одном сервере? – jsalonen

+0

Сервер запускается программно с использованием Node.js, используя обычный материал 'http.createServer.listen'. И, к сожалению, да, я * DO * должен иметь новый экземпляр для каждого теста: - / –

ответ

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% независимы.