2012-08-31 10 views
5

Jestem obecnie prawie na końcu długiej podróży w testowanie szyn, ale zastanawiam się, jak uzyskać specyfikacje zleceń pracujących z subdomenami.Testowanie subdomen w kapibarze/rspec

W rozwoju używam pow z adresami URL, takimi jak: http://teddanson.myapp.dev/account, który jest w porządku i jest elegancki.

W testowaniu pozwoliłem kapibarze zrobić to, co zwraca localhost http://127.0.0.1:50568/account, co oczywiście nie gra dobrze z całą subdomeną. Działa dobrze dla publicznej części aplikacji, która nie wymaga subdomen, ale dostęp do konta subdomeny danego użytkownika jest poza mną.

danych trasach są dostępne za pośrednictwem następujących metod:

class Public 
    def self.matches?(request) 
    request.subdomain.blank? || request.subdomain == 'www' 
    end 
end 

class Accounts 
    def self.matches?(request) 
    request.subdomain.present? && request.subdomain != 'www' 
    end 
end 

czuję się jak szalone Biorę pigułki, więc jeśli ktoś ma jakieś rady lub sugestie, aby pomóc mi się, że byłoby bardzo, bardzo niesamowite . Dzięki za pomoc!

Odpowiedz

2

Można użyć xip.io przetestować subdomen w Kapibara/RSpec, jak opisano tutaj: http://www.chrisaitchison.com/2013/03/17/testing-subdomains-in-rails/

+0

szczegółowe i eleganckie rozwiązanie używając 37signals xip.io. Dziękuję Ci! @cmaitchison – BenU

+0

W oryginalnym artykule autor używa xip.io. Oznacza to jednak, że takie testy wymagają połączenia z Internetem, a bez niego spadną! A to powinno spowolnić testowy test, ponieważ na każdym teście z subdomeną trafi najpierw na stronę. – ExiRe

1

Niestety, nie można użyć subdomeny w teście kapibara, ale mam obejście tego problemu. mam pomocnika klasy rozwiązywania subdomenę z żądania, patrz:

class SubdomainResolver 
    class << self 
    # Returns the current subdomain 
    def current_subdomain_from(request) 
     if Rails.env.test? and request.params[:_subdomain].present? 
     request.params[:_subdomain] 
     else 
     request.subdomain 
     end 
    end 
    end 
end 

Jak widać, gdy aplikacja jest uruchomiona w trybie test oraz specjalny _subdomain Żądanie param jest ustawiony subdomena jest pobierana z życzeniem param o nazwie _subdomain inaczej używany jest request.subdomain (normalna poddomena).

Aby uczynić tę pracę obejście trzeba także zmienić url budowniczych, w app/helpers utworzyć następujący moduł:

module UrlHelper 
    def url_for(options = nil) 
    if cannot_use_subdomain? 
     if options.kind_of?(Hash) && options.has_key?(:subdomain) 
     options[:_subdomain] = options[:subdomain] 
     end 
    end 

    super(options) 
    end 

    # Simple workaround for integration tests. 
    # On test environment (host: 127.0.0.1) store current subdomain in the request param :_subdomain. 
    def default_url_options(options = {}) 
    if cannot_use_subdomain? 
     { _subdomain: current_subdomain } 
    else 
     {} 
    end 
    end 

    private 

    # Returns true when subdomains cannot be used. 
    # For example when the application is running in selenium/webkit test mode. 
    def cannot_use_subdomain? 
    (Rails.env.test? or Rails.env.development?) and request.host == '127.0.0.1' 
    end 
end 

SubdomainResolver.current_subdomain_from może być również używany jako ograniczenie w config/routes.rb

Mam nadzieję, że to pomoże .