Как программно закрыть экземпляр 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, чтобы понять это.