Rails, Capybara и поддомены: как посетить определенный поддомен - PullRequest
14 голосов
/ 18 ноября 2010

Рельсы 3, Огурец 0,9,4, Капибара 0,4,0

Я хочу проверить свои функции с поддоменом. Я нашел это решение:

Given /^I visit subdomain "(.+)"$/ do |sub|
  Capybara.default_host = "#{sub}.example.com" #for Rack::Test
  Capybara.app_host = "http://#{sub}.example.com:9887" if Capybara.current_driver == :culerity
end

Это работает, если я запускаю cucumber features/subdomain.feature, но не работает, если я запускаю cucumber features! Это невероятно, но это правда. Я зарегистрировал текущие URL, и это subdomain.example.com для cucumber features/subdomain.feature и www.example.com для cucumber features для одного сценария с

Scenario: subdomain scenario
  Given I visit subdomain "subdomain"

в обоих случаях!

Я не знаю причину ...

Есть ли лучший способ проверки поддоменов с помощью капибары?

Ответы [ 3 ]

13 голосов
/ 21 февраля 2011

Хорошо, вот что должно быть довольно простым и легким для понимания взломом Capybara, который дает желаемое поведение, а именно, чтобы иметь возможность создавать новый сеанс каждый раз, когда вы переключаете субдомены.Это полезно для сайтов, где пользователь регистрируется в одном домене (что приводит к созданию субдомена для его учетной записи), а затем заканчивается необходимость перехода к этому субдомену.

Прежде всего (и эта частьэто довольно часто встречается в других решениях) и дайте себе возможность изменить Capybara.default_host на шаге Cucumber.Я сделал это так:

Then /^I switch the subdomain to (\w+)$/ do |s|
  Capybara.default_host = "#{s}.smackaho.st"
end

Вставьте этот шаг в функцию огурца в той точке, где вы хотите использовать новый поддомен.Например:

When I open the email
Then I should see "http://acme.rightbonus.com/users/confirmation" in the email body

Given I switch the subdomain to acme
When I follow "Click here to finish setting up your account" in the email
Then I should be on the user confirmation page for acme

Теперь для магической обезьяньей ловушки, которая делает эту работу.По сути, вы хотите, чтобы Capybara была достаточно умной, чтобы обнаруживать, когда поддомен изменился, и сбрасывать объект сеанса RackTest.

# features/support/capybara.rb

class Capybara::Driver::RackTest
  # keep track of the default host you started with
  def initialize(app)
    raise ArgumentError,
      "rack-test requires a rack application, but none was given" unless app
    @app = app
    @default_host = Capybara.default_host
  end

  def process(method, path, attributes = {})
    reset_if_host_has_changed
    path = ["http://", @default_host, path].join
    return if path.gsub(/^#{request_path}/, '') =~ /^#/
    path = request_path + path if path =~ /^\?/
    send(method, to_binary(path), to_binary( attributes ), env)
    follow_redirects!
  end

  private

  def build_rack_mock_session # :nodoc:
    puts "building a new Rack::MockSession for " + Capybara.default_host
    Rack::MockSession.new(app, Capybara.default_host || "www.example.com")
  end

  def reset_if_host_has_changed
    if @default_host != Capybara.default_host
      reset! # clears the existing MockSession
      @default_host = Capybara.default_host
    end
  end
end

Этот патч работает с Capybara 0.4.1.1 и, вероятно, не будет работать с другими версиями, если не будет изменен,Удачи.

5 голосов
/ 30 марта 2013

Если ваши потребности не включают в себя ничего общего с сессиями, и все, что вам нужно, это посетить другой поддомен, я написал эту функцию:

def visit_with_subdomain(uri, options = {})
  domain = Capybara.default_host
  port = Capybara.server_port
  subdomain = options[:subdomain]
  visit "http://#{subdomain}.#{domain}:#{port}#{uri}"
end

Вы можете назвать это так:

visit_with_subdomain some_path, subdomain: some_subdomain
1 голос
/ 10 апреля 2011

У меня была такая же проблема с немного, и моему тесту приходилось иногда переключаться или перенаправлять туда и обратно между поддоменами.

с учетом этого шага:

When /^(?:|I )go to "(.+)"$/ do |url|
  visit url
end

When I go to "http://mysubdomain.example.org" работает втест в стойке, но если вы перенаправлены приложением или переходите по какой-либо другой ссылке, хост возвращается к default_host.

В hassox есть ответвление стойки-теста от hassox, которое гарантирует, чтоrack-test отслеживает хост, использованный в предыдущем запросе.

Итак, в моем Gemfile, прежде чем требовать капибару:

  gem 'rack-test', :git => "https://github.com/hassox/rack-test.git"

Теперь, если мне нужно нажать на определенный поддомен (илиприложение перенаправляет меня к одному, например secure.myapp.com / sign_in ) Я уверен, что функция может читать больше, как браузер ведет себя: она позволит мне оставаться на текущем поддомене, пока яgo - использование Capybara visit("somesubdomain.example.org") - или приложение перенаправлено на другой хост.

...