Okej, oto, co powinno być dość prostym i łatwym do zrozumienia hackowaniem Kapibary, które przynosi pożądane zachowanie, a mianowicie, aby móc utworzyć nową sesję za każdym razem, gdy zmieniasz subdomeny. Jest to przydatne w przypadku witryn, w których użytkownik rejestruje się w jednej domenie (co powoduje utworzenie subdomeny na swoim koncie), a następnie kończy nawigację do tej poddomeny.
Przede wszystkim (i ta część jest dość powszechna dla innych rozwiązań), proszę śmiało i dać sobie sposób na zmianę Capybara.default_host w kroku Ogórek. Zrobiłem to tak:
Then /^I switch the subdomain to (\w+)$/ do |s|
Capybara.default_host = "#{s}.smackaho.st"
end
stick to krok w swojej funkcji Ogórek w miejscu, gdzie ma zostać nowa subdomena ma być używany. Na przykład:
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
Teraz za magiczne małpowanie, które sprawia, że to działa. Zasadniczo chcesz, aby Capybara była na tyle sprytna, aby wykrywać, kiedy subdomena się zmieniła i zresetować obiekt sesji 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
Łata współpracuje z Kapibara 0.4.1.1 i prawdopodobnie nie będzie działać z różnymi wersjami chyba modyfikowane. Powodzenia.
Tak! Ciekawe rozwiązanie. Ale ma jedną kwestię. Jeśli używam "pokaż mi stronę", mam: oczekiwano: "/ admin/firm", otrzymałem: "/ home/user/webdev/project/public/admin/companies" (używając ==) (RSpec :: Oczekiwania :: ExpectationNotMetError) – petRUShka
A co z opisem kroku "Czy powinienem być na stronie potwierdzenia dla acme"? – petRUShka