Rails порт тестовой среды - PullRequest
4 голосов
/ 24 июля 2011

Я бы хотел протестировать HTTP API нашего приложения на Rails, используя Faraday и RSpec.Фарадею нужен адрес хоста + порт.К сожалению, порт среды тестирования всегда меняется.Как мне получить доступ к текущему порту программно в спецификации?

Ответы [ 2 ]

9 голосов
/ 24 июля 2011

Если вы используете Capybara, вы можете установить порт в spec_helper.rb следующим образом:

Capybara.server_port = 1234

Смотри также: https://github.com/jnicklas/capybara/pull/123

3 голосов
/ 05 июля 2013

Возможно, есть несколько способов сделать это, но сейчас это работает для меня:

Команда

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...