【问题标题】:Set default parameter to some rspec requests为某些 rspec 请求设置默认参数
【发布时间】:2021-10-10 10:34:03
【问题描述】:
上下文:

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

问题:

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

第一次尝试:

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

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 支持中为 some 路由设置默认参数?

【问题讨论】:

  • 是否有您计划应用的命名空间、约定或标记来区分您需要默认参数的那些路由?这可能会影响所使用的策略。
  • @stringsn88keys ,是的:为了清楚起见,我简化了路由,但所有本地化路由都在同一个 'dashboard` 命名空间中,所以它实际上是 domain.com/en/dashboard/courses 例如
  • stub default_url_options 怎么样在测试用例上返回 { locale: locale_you_want} 来测试 some routes ,所以它只对那些测试用例有效。

标签: ruby-on-rails ruby rspec rspec-rails


【解决方案1】:

第一个解决方案

在应用控制器上

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

【讨论】:

  • 感谢您的想法,但问题发生在此之前:当尝试在规范的visit 行中生成course_path(@course) 时,它需要语言环境...
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2017-12-02
  • 2022-08-12
  • 2018-01-28
  • 2021-01-15
相关资源
最近更新 更多