6

問題背景:如何測試在Rails的國際化使用RSpec

讓我們說,沒有在配置/區域設置/ en.yml是存在的關鍵一些真正重要的一行。

en: 
    foo: 
    bar: "bubla!" 
  • 我不想考每一行,但
  • 我不想測試太脆(所以沒有I18n.t(「foo.bar」)。應該= 〜/ bubla /)

這樣的方式,我目前正在測試是這樣

#spec/locals_spec.rb 

require 'spec_helper' 
describe I18n do 
    it do 
    I18n.t('date.datepicker').should be_kind_of(String) 
    end 
end 

這樣我只是確保翻譯存在,它不會持續(如「F oo.bar.car.lol」

而我依然不滿意

問題:什麼是測試使用RSpec和規範文件,我應該把他們的I18n翻譯的最佳做法?

+0

@Paul回答我重構爲: it {I18n.available_locales.each {| locale | I18n.t('date.datepicker')。應該是be_kind_of(字符串)} – equivalent8 2012-07-06 08:36:13

回答

0

我認爲我會爲這樣一個「關鍵」的事情寫一個驗收測試。

在大多數情況下,您需要在某些特定情況下的翻譯,即。在日期選擇器中顯示某些內容。我會測試使用水豚或任何與JavaScript驅動程序工作的上下文。

只是測試這個翻譯存在是沒用的,如果你沒有它的內部使用的上下文。

+0

你可以通過閱讀關鍵字「datapicker」:)獲得上下文權限......讓我說幫助我將處理datepicker輸入的所有呈現。我已經創建了helper spec來檢查是否所有的東西都存在。但是我把I18n留到了返回虛擬值I18n.stub(:t){'exampleformat'} ....所以這種方式我確信html上下文是正確渲染的,這只是我擔心的實際翻譯。 ..源https://gist.github。com/3053409助手在底部 – equivalent8 2012-07-05 16:24:25

4

檢查this StackOverflow question的一些想法。我的首選方法是對同一問題this answer

更新:這些天我傾向於使用i18n-tasks寶石來處理相關的測試國際化,而不是我上面寫的,或者以前回答StackOverflow上。

我想在我的RSpec測試中使用i18n,主要是爲了確保我有翻譯的一切,即沒有翻譯錯過。 i18n任務可以通過靜態分析我的代碼來做到這一點,所以我不需要再對所有I18n.available_locales進行測試(除了測試非常特定於語言環境的功能時,例如,從任何語言環境切換到任何語言環境系統中的其他語言環境)。

這樣做意味着我可以確認系統中的所有i18n密鑰實際上都有值(並且沒有任何未使用或過時),同時保持重複測試的次數,從而減少套件運行時間。

+0

嘿,thanx的答案,但一般來說你的解決方案是相同的@Phoet在下面的帖子中描述,請閱讀我的評論,但我喜歡循環trought的想法* I18n.available_locales.each * + 1的那個 – equivalent8 2012-07-06 08:35:33

+0

@ equivalent8,這有點晚,但希望我的更新能夠提供另一種測試國際化的替代方案。如果自從您上次更新此問題以來您已經學會了其他任何內容,請分享! – 2013-11-06 10:32:04