ruby-on-rails 为什么Rspec忽略了我在application_controller.rb中设置的default_url_options

1bqhqjot  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(106)

我已经覆盖了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这样做呢?

vcirk6k6

vcirk6k61#

我也遇到了类似的问题,但在测试ActionMailer类时。它不是ActionController,因此未调用default_url_options
我不得不在configuration中配置默认语言环境:

# config/environments/test.rb
Rails.application.configure do
  # ...

  config.action_mailer.default_url_options = {:host => 'localhost:3001', :locale => :de}
end

字符串
也许你的配置中有一个类似的行覆盖了url_options

uyto3xhc

uyto3xhc2#

试着把

config.before(:each, type: :request) do
  default_url_options[:locale] ||= I18n.default_locale
end

字符串
在测试文件(例如rails_helper.rb)中调用的帮助器中。
请参阅:https://github.com/rspec/rspec-rails/issues/255

相关问题