it-swarm.com.ru

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

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

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

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

86
drewww

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

var server = app.listen(3000);

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

Используйте 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

14
Srijan Choudhary

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

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

0
Josh Smith