如何使用RSpec在Rails中测试i18n

equ*_*nt8 6 ruby-on-rails internationalization rspec-rails ruby-on-rails-3

问题背景:

假设config/locales/en.yml中有一些非常重要的行对于存在至关重要.

en:
  foo:
    bar: "bubla!"
Run Code Online (Sandbox Code Playgroud)
  • 我不想测试每一行但是
  • 我不希望测试太脆弱(所以没有I18n.t('foo.bar').should =〜/ bubla /)

所以我现在测试的方式是这样的

#spec/locals_spec.rb

require 'spec_helper'
describe I18n do
  it do
    I18n.t('date.datepicker').should be_kind_of(String)
  end
end
Run Code Online (Sandbox Code Playgroud)

这样我只是确保翻译存在并且不会继续(例如'foo.bar.car.lol'

但我仍然不满意

问题:使用RSpec测试I18n翻译的最佳实践是什么?在spec文件夹中我应该放置它们?

Pau*_*nti 5

查看此StackOverflow问题以获取一些想法.我首选的方法就是回答同一个问题.

更新:这些天我倾向于使用i18n-tasks gem来处理与i18n相关的测试,而不是我上面写的或者之前已经在StackOverflow上回答的问题.

我想在我的RSpec测试中使用i18n主要是为了确保我对所有内容都有翻译,即没有错过任何翻译.i18n-tasks可以通过我的代码的静态分析来做到这一点,所以我不需要再为所有人运行测试I18n.available_locales了(除了测试特定于语言环境的功能时,例如,从任何语言环境切换到任何其他语言环境)系统中的区域设置).

这样做意味着我可以确认系统中的所有i18n密钥实际上都有值(并且没有未使用或过时),同时保持重复测试的数量,从而减少套件运行时间.