2011-03-24 65 views
24

如何添加翻譯測試到我的規格?例如:添加I18n翻譯到rspec測試

flash[:error].should == I18n.translate 'error.discovered' 

這當然不起作用。如何使它工作?

我想確保我得到一個特定的錯誤。

+0

嘗試應用程序('error.discovered')真的沒有線索,但也許你是幸運的:) – 2011-03-27 01:04:51

回答

59

在我的代碼,一個Rails3中的項目,使用rspec2,這正是該行我寫:

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 

所以我不知道你爲什麼說這是不可能的?

+0

:O:O您的語法有效!我的不會。我猜如果你像我那樣做,你也會得到一個錯誤。不知道爲什麼會發生,但這確實是解決方案! – Spyros 2011-03-27 09:26:48

+0

本來可能是斷言右手邊缺失的人的情況。 – 2013-12-06 17:28:07

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 
+0

這實際上並不實際,因爲我將不得不通過錯誤消息文本。我想只通過翻譯標識符error.discovered。 – Spyros 2011-03-27 02:11:23

+2

在這種情況下,您不想測試翻譯庫是否工作,只是您的控制器代碼是否調用translate方法並將翻譯分配給'flash [:error]'。方法存根替換'I18n.translate'並返回塊中傳遞的值 - 錯誤消息文本本身並不重要,它可以是任何你喜歡的。 – zetetic 2011-03-27 03:53:10

+0

我其實想檢查flash [:error]的消息是否是預期的翻譯消息。我想這樣做的原因是因爲害怕在我的rspec測試中將其與其他flash [:error]消息混合。例如,我可能會檢查用戶是否有黃金並且通過flash [:error]的測試不應該爲零。雖然測試成功了,但也可能是之前的另一個錯誤閃現。它確實發生了,並且很幸運地發現它:/ – Spyros 2011-03-27 04:06:31

12

不知道這是否是最佳的,但在我的Rails3中/ RSpec2應用程序,我測試的RSpec的我所有的語言環境翻譯下列方式:

我設定的可用區域設置在我配置/初始化/ i18n中。 RB文件:

I18n.available_locales = [:en, :it, :ja] 

並在需要變換檢查我的測試,看起來像我的規格文件:

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,所以我只是增加了一個小的便捷方法規格/支持/ utilities.rb

def t(string, options={}) 
    I18n.t(string, options) 
end 

更新:現在我傾向於使用i18n-tasks gem來處理與i18n相關的測試,而不是我之前寫過或在StackOverflow中回答過的測試。

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

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