添加I18n翻译到rspec测试

Spy*_*ros 26 rspec ruby-on-rails

如何在我的规格中添加翻译测试?就像是 :

flash[:error].should == I18n.translate 'error.discovered'
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.如何使它工作?

我想确保我收到一些错误.

nat*_*vda 65

在我的代码中,使用rspec2的rails3项目,这正是我写的行:

describe "GET 'index'" do
  before do
    get 'index'
  end
  it "should be successful" do
    response.should be_redirect
  end

  it "should show appropriate flash" do
    flash[:warning].should == I18n.t('authorisation.not_authorized')
  end
end
Run Code Online (Sandbox Code Playgroud)

所以我不确定你为什么说这是不可能的?


Pau*_*nti 13

不确定这是否是最佳的,但在我的Rails3/RSpec2应用程序中,我通过以下方式测试RSpec中的所有语言环境翻译:

我在config/initializers/i18n.rb文件中设置了可用的语言环境:

I18n.available_locales = [:en, :it, :ja]
Run Code Online (Sandbox Code Playgroud)

在我需要翻译检查的spec文件中,我的测试看起来像:

describe "Example Pages" do   

  subject { page }

  I18n.available_locales.each do |locale|

    describe "example page" do
      let(:example_text) { t('example.translation') }

      before { visit example_path(locale) }

      it { should have_selector('h1', text: example_text) }
      ...
    end
    ...   
  end
end
Run Code Online (Sandbox Code Playgroud)

我不知道如何t()在不需要的情况下获得可在规范中使用的方法,I18n.t所以我只是在spec/support/utilities.rb中添加了一个小的便捷方法:

def t(string, options={})
  I18n.t(string, options)
end
Run Code Online (Sandbox Code Playgroud)

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

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

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