我正在使用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中并验证它是否已加载 正确地)。
提前致谢。
答案 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
将这两个代码片段放在我的规范助手类中就意味着我这样做了 不需要在更改期间更改我之前的所有控制器/路由规范 实现支持我的应用程序的多个区域设置。
希望这有帮助,