2012-08-31 59 views
5

我目前几乎在进入rails测试的漫长旅程结束时,但我正在抨击如何获得子域名请求规范。水豚测试子域名/ rspec

在开发中,我使用的是urls,例如:http://teddanson.myapp.dev/account,这些都很好,很花哨。

在测试中,我让水豚做它的东西,返回本地主机http://127.0.0.1:50568/account这显然不能很好地与整个子域的事情。它适用于不需要子域的应用程序的公共部分,但如何访问给定用户的子域帐户超出了我的想象。

相关的路线通过这些方法访问:

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 

我觉得我疯了服用药丸,因此,如果任何人有任何意见或建议,以帮助我走出那会是非常,非常真棒。谢谢你的帮助!

回答

2

可以使用xip.io在水豚/ RSpec的测试子域,如下所述:http://www.chrisaitchison.com/2013/03/17/testing-subdomains-in-rails/

+0

详细和优雅的使用溶液37signals的xip.io.谢谢! @cmaitchison – BenU

+0

在原文中作者使用xip.io.但这意味着这种测试需要互联网连接,没有它们就会掉线!而且这也会减慢测试服的速度,因为每次测试时都会先到达站点。 – ExiRe

1

不幸的是,你不能在水豚的测试中使用子域名,但我有解决这个问题的方法。 我有解决因该请求的子域的辅助类,请参见:

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 

正如你看到的,当应用程序在test模式下运行和特殊_subdomain请求参数是设置的子域是从请求PARAM取称为_subdomain,否则使用request.subdomain(正常子域)。

为了让你也必须重写URL建设者此解决办法工作,app/helpers创建以下模块:

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也可以用来作为约束在config/routes.rb

我希望它会帮助你。