Подтвердить что ты не робот

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?

4b9b3361

Ответ 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.

Ответ 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

от:

  • capybara (2.4.1)
  • capybara-webkit (1.3.0)

    Capybara.server_host = "example.com"
    Capybara.server_port = 3050
    Capybara.run_server = true
    Capybara.javascript_driver = :webkit #requires capybara-webkit