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