как программно закрыть экземпляр expressjs для тестирования?

<p>я пытаюсь выяснить, как закрыть экземпляр express. по сути, я хочу инвертировать вызов <code>.listen(port)</code> - как заставить сервер express остановить прослушивание, освободить порт и завершить работу полностью?</p><p>я знаю, что это может показаться странным запросом, так что вот контекст; возможно есть другой способ приблизиться к этому, и я думаю об этом неправильным способом. я пытаюсь настроить среду тестирования для моего приложения socket.io/nodejs. это одностраничное приложение, поэтому в моих сценариях тестирования (я использую <a href="http://visionmedia.github.com/mocha/">mocha</a> , но это не имеет большого значения) я хочу иметь возможность запустить сервер, запустить тесты на нем, а затем выключите сервер. я могу обойти это, предполагая, что либо сервер включен перед началом теста, либо если один из тестов запускает сервер и каждый последующий тест предполагает, что он работает, но это действительно грязно. я бы предпочел, чтобы каждый тестовый файл запускал экземпляр сервера с соответствующими настройками, а затем закрывал этот экземпляр по окончании тестов. это означает, что нет никаких странных зависимостей от запуска теста, и все чисто. это также означает, что я могу выполнить тестирование запуска/выключения.</p><p>итак, какой-нибудь совет о том, как это сделать? я думал о том, чтобы вручную вызывать исключения, чтобы сбить его, но это кажется грязным. я копался в документах и источниках express, но не могу найти какой-либо метод, который выключит сервер. для этого также может быть что-то в socket.io, но поскольку сервер сокетов просто подключен к серверу express, я думаю, что это должно происходить на уровне express.</p>

<p> <a href="https://github.com/visionmedia/express/issues/1366">все изменилось</a> потому что экспресс-сервер больше не наследует от узла http-сервер. к счастью, app.listen возвращает экземпляр сервера.</p><pre><code>var server = app.listen(3000); // listen for an event var handler = function() { server.close(); }; </code></pre>

<p>используйте <code>app.close()</code>. полный пример:</p><pre><code>var app = require('express').createserver(); app.get('/', function(req, res){ res.send('hello world'); }); app.get('/quit', function(req,res) { res.send('closing..'); app.close(); }); app.listen(3000); </code></pre><p>вызовите <code>app.close()</code> внутри обратного вызова, когда тесты закончились. но помните, что процесс все еще работает (хотя он больше не слушает).</p><p>если после этого вам нужно завершить процесс, тогда вызовите <code>process.exit(0)</code>.</p><p>ссылки:</p><p>app.close: <a href="http://nodejs.org/docs/latest/api/http.html#server.close">http://nodejs.org/docs/latest/api/http.html#server.close</a> (то же самое относится к)</p><p>process.exit: <a href="http://nodejs.org/docs/latest/api/process.html#process.exit">http://nodejs.org/docs/latest/api/process.html#process.exit</a> </p>

<p>вы можете легко сделать это, написав bash-скрипт для запуска сервера, запуска тестов и остановки сервера. преимущество этого заключается в том, что вы можете использовать псевдоним этого скрипта для быстрого и простого выполнения всех ваших тестов.</p><p>я использую такие сценарии для всего процесса непрерывного развертывания. вы должны взглянуть на <a href="http://jonrohan.me/guide/git/dead-simple-git-workflow-for-agile-teams/">jon rohan's dead simple git workflow</a> для некоторого понимания этого.</p>