控制器规范和default_url_options

时间:2014-09-22 06:26:01

标签: ruby-on-rails

我正在使用Rails 3.1.3和rspec-rails 2.8.1。我有一个范围':locale' 在routes.rb中,我想运行控制器和路由 眼镜。我知道设置default_url_options的问题 application.rb controller所以我应用了最后找到的解决方案 评论rspec问题#255( https://github.com/rspec/rspec-rails/issues/255

#./spec/support/default_locale.rb
class ActionView::TestCase::TestController
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

class ActionDispatch::Routing::RouteSet
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

#./spec/controllers/categories_controller_spec.rb
require "spec_helper"

describe CategoriesController do

  describe "GET index" do
    it "assigns all categories as @categories" do
      category = Factory :category

      get :index
      assigns(:categories).to_a.should eq([category])
    end
  end
end

此测试失败并出现路由错误,但如果我使用“get:index, locale :: fr“而不仅仅是”get:index“测试通过。 这个测试是控制器规范的一个例子,但是我的测试失败了 路由和请求。 (我没有观看规格但是 我很确定他们也会失败)

我无法弄清楚问题的来源以及补丁的原因 不解决它。还有其他事吗? (我只是把代码 在./spec/support/default_locale.rb中并​​验证它是否已加载 正确地)。

提前致谢。

1 个答案:

答案 0 :(得分:0)

此代码在控制器中注入语言环境 params(这使得我的所有控制器规范都没有明确地通过 在每个控制器规范中指定区域设置:

class ActionController::TestCase
  module Behavior
    def process_with_default_locale(action, parameters = nil, session =
nil, flash = nil, http_method = 'GET')
      parameters = { :locale => I18n.default_locale }.merge( parameters
|| {} )
      process_without_default_locale(action, parameters, session, flash,
http_method)
    end
    alias_method_chain :process, :default_locale
  end
end

这是我用来在Rails中注入语言环境的“作弊” assert_recognizes方法(这使得我的所有路由规范都没有通过 明确指定每个路由规范中的语言环境):

module ActionDispatch::Assertions::RoutingAssertions
  def assert_recognizes_with_default_locale(expected_options, path,
extras={}, message=nil)
    expected_options = { :locale => I18n.default_locale.to_s
}.merge(expected_options || {} )
    assert_recognizes_without_default_locale(expected_options, path,
extras, message)
  end
  alias_method_chain :assert_recognizes, :default_locale
end

将这两个代码片段放在我的规范助手类中就意味着我这样做了 不需要在更改期间更改我之前的所有控制器/路由规范 实现支持我的应用程序的多个区域设置。

希望这有帮助,