首页 > 解决方案 > 为某些 rspec 请求设置默认参数

问题描述

语境:

我们的一些 Rails 路由需要语言环境来生成 url(例如domain.com/en/courses),而基本控制器(for domain.com)不使用语言环境。default_url_options我们通过在正确的控制器中添加语言环境来设置它。

问题:

但是在 Rspec 中测试它时,我收到一个missing required keys询问语言环境的错误。当我在规范中添加语言环境参数时,visit course_path(@course, locale: :en)一切都恢复正常......但我们有很多规范!

第一次尝试:

我尝试使用这种default_url_option方法ActionView::TestCase::TestControllerActionDispatch::Routing::RouteSet就像这样

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

但它为整个应用程序设置了语言环境,而不仅仅是一些特定的路线......

问题:

有没有办法为 rspec 支持中的某些路由设置默认参数?

标签: ruby-on-railsrubyrspecrspec-rails

解决方案


第一个解决方案

在应用程序控制器上

if Rails.env.test?
  before_action :set_default_locale

  private
  def set_default_locale
    I18n.locale = params.fetch(:locale, :en)
  end
end

我知道这不是正确的方法

它不会在 rspec 级别更新您的应用程序,但到目前为止,这是我能想到的


第二种替代解决方案

路线级别更新

if Rails.env.test?
  defaults = { locale: :en }
else
  defaults = {}
end
scope "(:locale)", :locale => /en|id/, :defaults => defaults do

推荐阅读