如何在我的规格中添加翻译测试?类似的东西:
flash[:error].should == I18n.translate 'error.discovered'
这当然不起作用。如何使它工作?
我想确保我收到一些错误。
答案 0 :(得分: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
所以我不确定你为什么说不可能?
答案 1 :(得分:13)
不确定这是否是最佳的,但在我的Rails3 / RSpec2应用程序中,我通过以下方式测试RSpec中的所有语言环境翻译:
我在 config / initializers / i18n.rb 文件中设置了可用的区域设置:
I18n.available_locales = [:en, :it, :ja]
在我需要翻译检查的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
我不确定如何在不需要t()
的情况下让I18n.t
方法在规范中使用,所以我只是为 spec / support / utilities添加了一个小的便捷方法。 RB 强>:
def t(string, options={})
I18n.t(string, options)
end
更新:这些天我倾向于使用i18n-tasks gem来处理与i18n相关的测试,而不是我上面写的或之前在StackOverflow上回答过的。
我想在我的RSpec测试中使用i18n主要是为了确保我对所有内容都有翻译,即没有错过任何翻译。通过对我的代码进行静态分析,i18n-tasks可以做到这一点,所以我不再需要为所有I18n.available_locales
运行测试了(除了测试特定于语言环境的功能时,例如,从任何语言环境到系统中的任何其他语言环境。)
这样做意味着我可以确认系统中的所有i18n密钥实际上都有值(并且没有未使用或已过时),同时保持重复测试的数量,从而保持套件运行时间的下降。
答案 2 :(得分:3)
假设控制器中的代码是:
flash[:error] = I18n.translate 'error.discovered'
你可以存根'翻译':
it "translates the error message" do
I18n.stub(:translate) { 'error_message' }
get :index # replace with appropriate action/params
flash[:error].should == 'error_message'
end