Capybara с субдоменами - default_host
У меня есть приложение, которое использует субдомены для переключения баз данных (multi-tenancy). Я пытаюсь использовать Capybara для тестирования интеграции, и это действительно сильно зависит от субдоменов.
Мое понимание заключалось в том, что установка Capybara.default_host=
на что-то заставит все мои запросы поступать с этого хоста. Кажется, это не так. В этом сообщении автор рекомендует просто посещать явный URL-адрес хостом, но это становится немного раздражающим, если я перемещаюсь повсюду. Я хотел бы просто установить хост, а затем использовать пути рельсов, как ожидалось. Не уверен, что я делаю неправильно, но вот что я пробовал:
# spec_helper.rb
RSpec.configure do |config|
config.before(:each, :type => :request) do
Capybara.default_host = 'http://app.mydomain.com'
end
end
# in some_integration_spec.rb
before do
puts "Capybara.default_host: #{Capybara.default_host}"
puts "some_app_url: #{some_app_url}"
end
Это дает результат:
Capybara.default_host: http://app.mydomain.com
some_app_url: http://www.example.com/some_path
Что я делаю неправильно? default_host
, похоже, ничего не делает. Как я уже сказал, я не хочу говорить visit(Capybara.default_host + some_app_path)
, как это немного раздражает каждый раз. Почему еще существует эта опция default_host?
Ответы
Ответ 1
Я не уверен в предполагаемом использовании default_host
, но app_host
делает то, что вам нужно. Я нашел, что мне сначала нужно вызвать метод сеанса рельсов host!
, чтобы установить строку хоста, которая будет передана контроллерам в объекте запроса.
Затем вам нужно установить Capybara.app_host
, чтобы сообщить Capybara о вызове вашего приложения через веб-сервер, а не просто делать вызовы в процессе. Если вы этого не сделаете, то Capybara парирует, когда он сталкивается с переадресацией и отбрасывает информацию о хосте во втором запросе.
Я не уверен, почему это не позаботится о конечном результате Rails request
, но я обнаружил, что, если я не установлю хост в обоих местах явно, я получаю несогласованные результаты.
def set_host (host)
host! host
Capybara.app_host = "http://" + host
end
before(:each) do
set_host "lvh.me:3000"
end
Затем вы можете просто использовать относительные пути для доступа к страницам.
Update:
Capybara 2.x и rspec-rails 2.12.0 представили спецификации "Feature" для запуска приемочных тестов Capybara. Новый модуль FeatureExampleGroup
в rspec-rails
отличается от RequestExampleGroup
и больше не имеет доступа к методу test-test host!
. Теперь вы хотите использовать default_url_options
вместо:
def set_host (host)
# host! host
default_url_options[:host] = host
Capybara.app_host = "http://" + host
end
Ответ 2
Когда вам нужно изменить URL-адрес для включения субдомена, вы можете указать app_host
в своих определениях шага. Используйте домен, например lvh.me
, поскольку он указывает на 127.0.0.1
:
Capybara.app_host = "http://#{subdomain}.lvh.me"
Capybara предполагает, что когда вы указываете app_host
, что вы тестируете удаленный сервер, работающий на порту 80, но в нашем случае мы тестируем локальное приложение, которое работает на случайном порту, указанном Capybara, Чтобы исправить это, в файле env.rb
добавьте эту строку:
Capybara.always_include_port = true
Теперь, когда вы посещаете страницу своего приложения...
visit '/page'
... url укажет субдомен, а также порт, на котором работает приложение.
FYI: Это сработало для меня с помощью Capybara 2.0.2.
Ответ 3
Этот парень имеет правильный ответ здесь:
http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M
Вы хотите сделать
Capybara.current_session.driver.reset!
Capybara.default_host = 'http://app.mydomain.com'
Ответ 4
Это не совсем та же ситуация, что и вы, но это может помочь некоторым людям:
В моем текущем проекте я использую pow со многими подобластями. Набор тестов также должен работать на другом порту.
Решение зависит от того, какую версию capybara вы используете.
Для текущей последней версии я помещаю это в custom_env.rb:
Capybara.server_host = 'myapp.dev'
Capybara.server_port = 9887
Capybara.run_server = true
# I don't remember what this was for. Another team member wrote this part...
module ActionDispatch
module Integration #:nodoc:
class Session
def host
[Capybara.server_host, Capybara.server_port].join(':')
end
end
end
end
С capybara 1.1.2 мне пришлось сделать вышеупомянутое изменение, но server_host
становится app_host
И изменит lib/capybara/server.rb в камне, как это:
def url(path)
..
if path =~ /^http/
path
else
# Was this (Capybara.app_host || "http://#{host}:#{port}") + path.to_s
(Capybara.app_host || "http://#{host}") + ":#{port}" + path.to_s
end
end
Ответ 5
от: