在capybara / rspec中测试子域

时间:2012-08-31 01:06:05

标签: ruby-on-rails rspec capybara

我目前几乎已经进入了一次长期的铁路测试之旅,但我正在敲打如何获取使用子域的请求规范。

在开发过程中,我使用的是诸如:http://teddanson.myapp.dev/account之类的网址,这一切都很好而且花花公子。

在测试中,我让capybara做了返回localhost 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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不幸的是你不能在capybara的测试中使用子域名,但我有一个解决这个问题的方法。 我有帮助类来解析请求中的子域,请参阅:

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请求参数时,子域名将从名为_subdomain的请求参数中获取,否则{{1}使用(普通子域)。

要使此解决方法正常工作,您还必须覆盖网址构建器,在request.subdomain中创建以下模块:

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

中的约束

我希望它会对你有所帮助。