2012-08-31 10 views
5

Actualmente estoy casi al final de un largo viaje hacia las pruebas de rieles, pero me estoy preguntando cómo obtener especificaciones de solicitud que funcionen con subdominios.Probando subdominios en capybara/rspec

En desarrollo, estoy usando pow con urls como: http://teddanson.myapp.dev/account que está todo bien y dandy.

En las pruebas, dejo que el capibara haga lo que devuelve localhost http://127.0.0.1:50568/account que obviamente no funciona bien con todo el subdominio. Funciona bien para la parte pública de la aplicación que no requiere subdominios, pero la forma de acceder a la cuenta de subdominio de un usuario dado me supera.

las rutas pertinentes, se accede a través de estos métodos:

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 

Siento que estoy tomando píldoras locos, así que si alguien tiene algún consejo o sugerencia para ayudarme eso sería muy, muy impresionante . ¡Gracias por tu ayuda!

Respuesta

2

Se puede utilizar para probar xip.io subdominios en Carpincho/RSpec, tal como se describe aquí: http://www.chrisaitchison.com/2013/03/17/testing-subdomains-in-rails/

+0

solución utilizando 37signals detalladas y elegantes xip.io. ¡Gracias! @cmaitchison – BenU

+0

En el autor del artículo original, se usa xip.io. ¡Pero eso significa que tales pruebas necesitan conexión a Internet y sin ella se caerán! Y también eso debería ralentizar la demanda de prueba porque en cada prueba con subdominio irá primero al sitio. – ExiRe

1

Lamentablemente no se puede usar el subdominio en la prueba de capibara, pero tengo una solución para este problema. tengo clase de ayuda para la resolución de un subdominio de la petición, consulte:

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 

Como se ve, cuando la aplicación se está ejecutando en test modo y un _subdomain solicitud parámetro especial se establece el subdominio se toma de la solicitud de parámetro llamado _subdomain; de lo contrario, se usa request.subdomain (subdominio normal).

Para que esto funcione solución tiene que anular también constructores de URL, en app/helpers crear el módulo siguiente:

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 puede también ser utilizado como restricción en config/routes.rb

espero que le ayudará .