我已经覆盖了application.rb中的default_url_options方法
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :set_locale
def redirect_to_root
redirect_to root_path
end
private
def default_url_options(options={})
{ locale: I18n.locale }.merge options
end
def set_locale
if params[:locale].blank?
logger.debug "* Accept-Language: #{request.env['HTTP_ACCEPT_LANGUAGE']}"
abbr = extract_locale_from_accept_language_header
I18n.locale = if Language.find_by(abbr: abbr).nil?
logger.debug "* Unknown Language"
I18n.default_locale
else
abbr
end
logger.debug "* Locale set to '#{I18n.locale}'"
else
I18n.locale = params[:locale]
end
end
def extract_locale_from_accept_language_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
end
end
字符串
效果不错。但当我开始控制器测试时,它们都失败了。举例来说:
it "renders show template" do
get :show, id: @book.id
expect(response).to render_template :show
end
ActionController::UrlGenerationError:
no route matches {:action=>"show", :controller=>"books", :id=>"1"}
型
为什么rspec不传递我在ApplicationController中设置的defautl url选项(locale)?怎么能告诉rspec这样做呢?
2条答案
按热度按时间vcirk6k61#
我也遇到了类似的问题,但在测试ActionMailer类时。它不是ActionController,因此未调用
default_url_options
。我不得不在configuration中配置默认语言环境:
字符串
也许你的配置中有一个类似的行覆盖了
url_options
。uyto3xhc2#
试着把
字符串
在测试文件(例如
rails_helper.rb
)中调用的帮助器中。请参阅:https://github.com/rspec/rspec-rails/issues/255