为某些 rspec 请求设置默认参数

gfd*_*gfd 5 ruby rspec ruby-on-rails rspec-rails

语境:

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

问题:

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

第一次尝试:

我尝试使用default_url_option中的方法ActionView::TestCase::TestController,就像ActionDispatch::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
Run Code Online (Sandbox Code Playgroud)

但它设置了整个应用程序的区域设置,而不仅仅是一些特定的路线......

问题:

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

Sai*_*Haq 1

第一个解决方案

在应用程序控制器上

if Rails.env.test?
  before_action :set_default_locale

  private
  def set_default_locale
    I18n.locale = params.fetch(:locale, :en)
  end
end
Run Code Online (Sandbox Code Playgroud)

我知道这不是正确的方法

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


第二种替代解决方案

路线级别更新

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