Rspec 视图规范被 default_locale 破坏

Posted

技术标签:

【中文标题】Rspec 视图规范被 default_locale 破坏【英文标题】:Rspec view specs broken by default_locale 【发布时间】:2015-05-25 09:22:41 【问题描述】:

我最近本地化了我的 Rails 应用程序并添加了默认语言环境“en”(我按照指示 here 将语言环境添加到我的 URL 中)。这打破了我的大部分规格;除了我的 View 规范之外,我已经能够找出所有解决方案/解决方法。

这是一个基本视图规范被破坏的示例,我的文章视图规范:

RSpec.describe 'articles/index', type: :view do
  before(:each) do
    assign(:articles, [
      FactoryGirl.create(:article, number: '11.22.33'),
      FactoryGirl.create(:article, number: '22.33.44')
    ])
  end

  it 'renders a list of articles' do
    render
  end
end

此规范导致以下错误:

 1) articles/index renders a list of articles
     Failure/Error: render
     ActionView::Template::Error:
       No route matches :action=>"show", :controller=>"articles", :id=>nil, :locale=>#<Article id: 2, number: "11.22.33", criminal_code_id: 3, description: nil, created_at: "2015-05-25 08:58:56", updated_at: "2015-05-25 08:58:56"> missing required keys: [:id, :locale]

好像有三个问题:

    Rspec 应该使用动作“index”而不是“show” “索引”操作应该不需要 :id 键 语言环境应该是“en”,而不是我创建的文章之一。

这是我的相关路线:

Rails.application.routes.draw do
  scope ':locale', locale: /#I18n.available_locales.join("|")/ do
    resources :articles do
      collection do
        get 'custom_json', constraints:  format: :json , defaults:  format: :json 
      end
    end

    get "*path", to: redirect("/#I18n.default_locale") # handles /en/fake/path/whatever
  end

  get '', to: redirect("/#I18n.default_locale") # handles /
  get '*path', to: redirect("/#I18n.default_locale/%path") # handles /not-a-locale/anything
end

这是我的应用程序控制器的相关部分:

before_action :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

def default_url_options(options = )
   locale: I18n.locale .merge options
end

我的文章视图位于 app/views/articles/index.html.erb(没有什么特别之处)。

有人知道如何让 View 规范与语言环境配合得很好吗?

【问题讨论】:

您可以添加您的routes.rb 和视图吗? @maxcal 刚刚添加 - 我保留了文章视图,但减少了与文章相关的代码的路径。 您是否在设置语言环境参数的 `ApplicationController 中创建了 add default_url_options 方法?同样在 *** 上,您应该始终在问题正文中添加代码。这可以防止链接失效。 是的,我的 ApplicationController 中有 default_url_options。我现在将其添加到问题中。至于 *** 风格,感谢您的提示,我没有意识到这一点。我想因为文章视图相当长,我不应该将整个内容添加到问题中。 【参考方案1】:

以下内容可能会对您有所帮助:

# Set locale for view specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-2865917
class ActionView::TestCase::TestController
  def default_url_options(options = )
    locale: I18n.default_locale
  end
end

# Set locale for feature specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-24698753
RSpec.configure do |config|
  config.before(:each, type: :feature) do
    default_url_options[:locale] = I18n.default_locale
  end
end

这对我有帮助。尽管如此,我还是觉得很尴尬,经过这么多年的 Rails I18n,一个人仍然必须自己关心这些事情。

【讨论】:

【参考方案2】:

在您等待某人发布更好的答案时,这是一个潜在的解决方法:

看起来您正在索引页面中为每篇文章创建一个 link_to。 link_to 中的 url 助手调用,例如article_path 是您的规范可能会破坏的地方。我遇到了类似的问题,无法解决。 url_helper 方法在测试环境中对我的工作方式与在开发或产品环境中的工作方式不同。更具体地说,在测试环境中,除非我在 url_helper 调用中使用 locale: 'en' 明确声明了语言环境,否则它们不起作用。

我环顾了很久,不知道为什么。

所以我决定像这样在我的视图规范中删除对 url_helpers 的调用

allow(view).to receive(:conversation_transmission_path).and_return("/")
allow(view).to receive(:edit_conversation_transmission_path).and_return("/")

这是 rspec 3.2 语​​法

【讨论】:

以上是关于Rspec 视图规范被 default_locale 破坏的主要内容,如果未能解决你的问题,请参考以下文章

Rails 视图规范:无法在命名空间视图中找到局部视图

在前块中创建的 Rspec 变量在功能规范到达 POSTed 控制器操作时被删除

Capybara-webkit、rspec 集成规范和 xvfb:webkit_server:致命 IO 错误:客户端被杀死

分页破坏了 RSpec 测试(Kaminari)

Rspec 数据库视图为空

RSpec:特性和请求规范有啥区别?