Rails助手不在测试环境中工作

时间:2011-07-17 04:39:01

标签: ruby-on-rails ruby cucumber integration-testing helper

我已按照http://railscasts.com/episodes/221-subdomains-in-rails-3提供的教程。

它允许您通过覆盖帮助文件中的url_for方法将子域选项传递给路由。 我的辅助方法看起来像这样:

module UrlHelper
  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  def url_for(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    super
  end
end

所以:

sites_homepage_url(:subdomain => "cats") 

生成网址:

"http://cats.example.com/sites/1/homepage" 

这在开发中很好用。然而,在我的黄瓜测试中,使用:

sites_homepage_url(:subdomain => "cats") 

产生

"http://www.example.com/sites/1/homepage?subdomain=cats"

表示我在助手中添加到url_for的功能无效。有人有任何想法吗?

修改:格式化并添加了UrlHelper的代码。

3 个答案:

答案 0 :(得分:2)

由于其他解决方案尚未奏效,您可以尝试更难的解决方案。

在初始化文件中(如 config / initializers / url_for_patch.rb ),添加以下内容:

ActionView::Helpers::UrlHelper.class_eval do

  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  alias_method_chain :url_for, :subdomain

  def url_for_with_subdomain(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    url_for_without_subdomain( options )
  end      

end

答案 1 :(得分:0)

您可以尝试在集成测试中添加以下代码

include ActionView::Helpers::UrlHelper

答案 2 :(得分:0)

您的问题中的代码是在顶级命名空间中定义新的UrlHelper模块。如果您尝试覆盖ActionView::Helpers::UrlHelper中的方法,则需要完全限定模块:

module ActionView
  module Helpers
    module UrlHelper
      def url_for
        # override as in your question
      end
    end
  end
end

我不确定Rails是否会对app / helpers中的内容感到满意,因此您可能需要将其放在lib/action_view/helpers/url_helper.rb中(如果您使用lib文件夹中的自动加载) ,或者您需要明确要求config/application.rb

中的文件