Возможно, есть несколько способов сделать это, но сейчас это работает для меня:
Команда
port = `lsof -p #{Process.pid} -ai TCP -as TCP:LISTEN -Fn | grep ^n | cut -c 4- | uniq`.strip
Обратите внимание, что вам придется сделать это в какой-то момент после загрузки приложения - то есть вы не можете использовать это в файле environment.rb
или application.rb
.
Объяснение
В основном эта команда выполняет следующие действия:
lsof
- команда Unix для открытых файлов LiSt
-p #{Process.pid}
ограничивает его текущим процессом (т. Е. Вашим тестовым экземпляром веб-сервера)
-ai TCP
ограничивает его «файлами» типа TCP (т. Е. Открытыми портами TCP). (Примечание: -a
должен сделать И поиск с pid - по умолчанию, используя только -i
ИЛИ поиск)
-as TCP:LISTEN
ограничивает только TCP-порты, которые прослушиваются on (в отличие от любого открытого порта - например, подключение вашего приложения к Postgres)
-Fn
говорит ему выводить только столбец «name», который в этом случае будет IP / портом, который прослушивается на
Вывод этой части сам по себе будет выглядеть примерно так:
p12345
n*:5001
n*:5001
Первая строка, начинающаяся с p
, - это идентификатор процесса. Там нет никакого способа подавить это.
Следующие 2 строки (не знаю, почему он может выдавать кратные значения, но мы позаботимся об этом через минуту) - это столбец «name» (отсюда n
), за которым следует порт IP +. В нашем случае (и я полагаю, что вы тоже в тестовой среде) веб-сервер прослушивает всех доступных локальных IP-адресов, таким образом *
. Затем он говорит нам, что порт, в данном случае 5001.
Наконец, мы проходим через это ...
* grep ^n
чтобы исключить первую строку (идентификатор процесса)
* cut
сказать "вырезать из столбцов 4 вкл.", Т.е. удалить n*:
, чтобы вернуть только порт, и
* uniq
чтобы получить только один экземпляр
(У него также будет завершающий символ новой строки, таким образом, вызов strip
.)
Использование
В моем случае я использую это в своем Cucumber env.rb
, таким образом, чтобы перенастроить параметры URL для ActiveMailer, чтобы мои ссылки электронной почты генерировались правильно как рабочие ссылки в тесте:
port = lsof -p #{Process.pid} -ai TCP -as TCP:LISTEN -Fn | grep ^n | cut -c 4- | uniq
.strip
MyApp :: Application.configure do
config.action_mailer.default_url_options [: host] = "0.0.0.0:# enjport}"
конец
Без сомнения, вы можете сделать то же самое в помощнике / конфиге для Rspec.