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

Я пытаюсь выяснить, как закрыть экземпляр Express. В принципе, я хочу, чтобы обратный вызов .listen(port) - как я могу заставить Express-сервер прослушивать STOP, освобождать порт и отключать его?

Я знаю, что это похоже на странный запрос, поэтому здесь контекст; возможно, есть еще один способ приблизиться к этому, и я думаю об этом неправильно. Я пытаюсь настроить среду тестирования для приложения socket.io/nodejs. Это одностраничное приложение, поэтому в моих тестовых сценариях (я использую Mocha, но это не имеет большого значения) Я хочу чтобы запустить сервер, выполнить тесты против него, а затем закрыть сервер. Я могу обойти это, предположив, что либо сервер включен, прежде чем запускается тест, либо, если один из тестов запустит сервер и каждый последующий тест примет его, но это действительно беспорядочно. Я бы предпочел, чтобы каждый тестовый файл запустил экземпляр сервера с соответствующими настройками, а затем закрыл этот экземпляр, когда тесты закончились. Это означает, что нет никаких странных зависимостей для запуска теста, и все чисто. Это также означает, что я могу выполнить тестирование при запуске/завершении работы.

Итак, какие-либо советы о том, как это сделать? Я думал о ручном запуске исключений, чтобы сбить его, но это кажется грязным. Я вырыл через экспресс-документы и источник, но не могу найти какой-либо метод, который отключит сервер. Для этого также может быть что-то в socket.io, но поскольку сервер сокетов просто подключен к серверу Express, я думаю, что это должно произойти на экспресс-уровне.

Ответ 1

Все изменилось, потому что экспресс-сервер больше не наследуется от node http-сервера. К счастью, app.listen возвращает экземпляр сервера.

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};

Ответ 2

Используйте app.close(). Полный пример:

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);

Вызовите app.close() внутри обратного вызова, когда тесты закончились. Но помните, что процесс все еще запущен (хотя он больше не прослушивается).

Если после этого вам нужно закончить процесс, вызовите process.exit(0).

Ссылки:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (то же самое относится и к)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

Ответ 3

Вы можете легко сделать это, написав bash script, чтобы запустить сервер, запустить тесты и остановить сервер. Это имеет то преимущество, что вы можете использовать псевдоним script для быстрого и легкого запуска всех ваших тестов.

Я использую такие скрипты для всего процесса непрерывного развертывания. Вы должны посмотреть Jon Rohan Dead Simple Git Workflow, чтобы понять это.