13

szyn 3, ogórek 0.9.4, Kapibara 0.4.0Rails, Kapibara i subdomen: Jak odwiedzić niektórych subdomenę

Chcę przetestować swoje możliwości z subdomeny. Znalazłem takie rozwiązanie:

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 

To działa, jeśli uruchomię cucumber features/subdomain.feature ale to nie działa, jeśli uruchomię cucumber features! To niewiarygodne, ale to prawda. Zalogowałem aktualnych adresów URL i jest subdomain.example.com dla cucumber features/subdomain.feature i www.example.com dla cucumber features dla jednego scenariusza z

Scenario: subdomain scenario 
    Given I visit subdomain "subdomain" 

w obu przypadkach!

nie wiem powód ...

Czy jest najlepszym sposobem testowania subdomen z kapibary?

Odpowiedz

12

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.

+0

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

+0

A co z opisem kroku "Czy powinienem być na stronie potwierdzenia dla acme"? – petRUShka

1

Miałem ten sam problem przez pewien czas, a mój test musiał czasami zmieniać lub przekierowywać między subdomenami.

podano ten krok:

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

When I go to "http://mysubdomain.example.org" prace w teście rack, ale jeśli są przekierowywane przez aplikację lub po kliknięciu na link do innej ścieżki host powraca do default_host.

Dzięki hassox jest to fork of rack-test, które zapewnia, że ​​test rackowy śledzi hosta użytego w poprzednim żądaniu.

Więc, moim Gemfile przed wymagającą kapibary:

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

Teraz jeśli muszę uderzyć konkretnej subdomeny (lub aplikacja przekierowuje mnie do jednego, jak secure.myapp.com/sign_in) Jestem pewien, że ta funkcja może być bardziej podobna do przeglądarki, która zachowałaby się: pozwoli mi pozostać na obecnej poddomenie, dopóki nie przejdę - przy użyciu kapibary visit("somesubdomain.example.org") - lub zostanie przekierowana przez aplikację na inny host.

5

Jeśli Twoje potrzeby nie zawierają nic wspólnego z sesjami, a wszystko jesteś po odwiedza inną subdomenę, napisałem tę funkcję:

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

można nazwać to tak:

visit_with_subdomain some_path, subdomain: some_subdomain 
+0

To jest najprostsze rozwiązanie. Dzięki. –

Powiązane problemy