2012-08-31 4 views
5

Je suis actuellement presque à la fin d'un long périple dans les tests de rails, mais je me demande comment obtenir des spécifications de requêtes fonctionnant avec des sous-domaines. En cours de développement, j'utilise pow avec des URLs telles que: http://teddanson.myapp.dev/account qui est tous fins et dandy. En test, je laisse capybara faire ce qui retourne localhost http://127.0.0.1:50568/account qui évidemment ne joue pas bien avec tout le sous-domaine. Cela fonctionne bien pour la partie publique de l'application qui ne nécessite pas de sous-domaines, mais la façon d'accéder au compte de sous-domaine d'un utilisateur donné me dépasse.Tests de sous-domaines dans capybara/rspec

Les routes concernées sont accessibles via ces méthodes:

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 

Je me sens comme si je prends des pilules folles, donc si quelqu'un a des conseils ou des suggestions pour me aider ce serait très, très impressionnant . Merci de votre aide!

Répondre

2

Vous pouvez utiliser xip.io pour tester dans les sous-domaines Capybara/RSpec, comme décrit ici: http://www.chrisaitchison.com/2013/03/17/testing-subdomains-in-rails/

+0

solution détaillée et élégante en utilisant 37signals xip.io. Je vous remercie! @cmaitchison – BenU

+0

Dans l'auteur de l'article original utilise xip.io. Mais cela signifie que de tels tests nécessitent une connexion Internet et sans elle, ils tomberont! Et cela devrait également ralentir la tenue de test car sur chaque test avec sous-domaine, il ira d'abord sur le site. – ExiRe

1

Malheureusement, vous ne pouvez pas utiliser de sous-domaine dans le test de capybara mais j'ai une solution de contournement pour ce problème. Je classe aide pour résoudre un sous-domaine de la demande, voir:

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 

Comme vous le voyez, lorsque l'application est en cours d'exécution en mode test et une _subdomain PARAMS spéciale est fixé le sous-domaine est tiré de la param demande appelé _subdomain sinon request.subdomain (sous-domaine normal) est utilisé.

Pour faire ce travail de contournement vous devez remplacer également les constructeurs url, en app/helpers créer le module suivant:

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 peut également être utilisé comme contrainte dans config/routes.rb

J'espère que cela vous aidera .

Questions connexes