Капибара с поддоменами - default_host - PullRequest
45 голосов
/ 30 июня 2011

У меня есть приложение, которое использует субдомены для переключения баз данных (многопользовательский режим). Я пытаюсь использовать 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?

Ответы [ 5 ]

58 голосов
/ 13 августа 2011

Я не уверен в предполагаемом использовании default_host, но app_host делает то, что вам нужно. Я обнаружил, что сначала мне нужно вызвать метод сеанса rails 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

Тогда вы можете просто использовать относительные пути для доступа к страницам.

Обновление:

Capybara 2.x и rspec-rails 2.12.0 представили спецификации "Feature" для запуска приемочных испытаний Capybara. Новый модуль FeatureExampleGroup в rspec-rails отличается от RequestExampleGroup и больше не имеет доступа к методу host! теста в стойке. Теперь вы хотите использовать default_url_options вместо:

def set_host (host)
  # host! host
  default_url_options[:host] = host
  Capybara.app_host = "http://" + host
end
31 голосов
/ 25 марта 2013

Когда вам нужно изменить 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будет указывать субдомен, а также порт, на котором запущено приложение.

К вашему сведению: у меня это работало с использованием Capybara 2.0.2.

5 голосов
/ 07 ноября 2011

У этого парня правильный ответ:

http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M

Вы хотите сделать

Capybara.current_session.driver.reset!
Capybara.default_host = 'http://app.mydomain.com'
1 голос
/ 21 сентября 2014

по состоянию на:

  • капибара (2.4.1)
  • капибара-webkit (1.3.0)

    Capybara.server_host = "example.com"
    Capybara.server_port = 3050
    Capybara.run_server = true
    Capybara.javascript_driver = :webkit #requires capybara-webkit
    
0 голосов
/ 17 июля 2012

Это не совсем та же ситуация, что и у вас, но это может помочь некоторым людям:

Для моего текущего проекта я использую pow со многими поддоменами.Набор тестов также должен работать на другом порту.

Решение зависит от того, какую версию капибары вы используете.

Для текущей последней версии я поместил это в 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

С капибарой 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
...