如何在Ruby on Rails中配置RSpec默认支持Locale以解决路由测试失败问题
解决RSpec路由测试因Locale作用域导致的失败问题
你的问题根源很清晰:所有业务路由都被包裹在/:locale作用域下,但测试里的请求路径没有带上locale前缀,自然找不到匹配的路由。下面给你几个实用的解决方案:
方法一:在测试中显式添加Locale前缀
最直接的方式就是修改测试用例,给请求路径加上默认locale的前缀,同时别忘了在route_to断言中指定locale参数(因为路由会捕获这个参数并传递给控制器):
RSpec.describe MyModelController, type: :routing do describe "routing" do it "routes to #index" do default_locale = I18n.default_locale.to_s expect(get: "/#{default_locale}/my_models").to route_to( "my_models#index", locale: default_locale ) end end end
方法二:全局配置RSpec路由测试的默认Locale
如果你不想每个测试都手动加前缀,可以在spec/rails_helper.rb或者spec/spec_helper.rb中添加全局配置,让所有路由测试自动带上默认locale:
RSpec.configure do |config| # 给所有路由测试设置默认locale参数 config.before(:each, type: :routing) do default_url_options[:locale] = I18n.default_locale end end
配置完成后,你就可以直接使用Rails的路径辅助方法(path helper)来生成带locale前缀的路径,测试代码会更简洁:
it "routes to #index" do expect(get: my_models_path).to route_to( "my_models#index", locale: I18n.default_locale.to_s ) end
方法三:在单个测试文件中设置默认Locale
如果不想全局修改配置,也可以在当前的路由测试文件中单独设置:
RSpec.describe MyModelController, type: :routing do before(:each) do default_url_options[:locale] = I18n.default_locale end describe "routing" do it "routes to #index" do expect(get: my_models_path).to route_to( "my_models#index", locale: I18n.default_locale.to_s ) end end end
关键注意点
不管用哪种方法,route_to断言中都需要包含locale参数——因为你的路由作用域会把/:locale部分解析为控制器参数,RSpec需要验证这一点才能通过测试。
内容的提问来源于stack exchange,提问作者moddayjob
相关产品推荐
相关产品推荐

