如何添加翻譯測試到我的規格?例如:添加I18n翻譯到rspec測試
flash[:error].should == I18n.translate 'error.discovered'
這當然不起作用。如何使它工作?
我想確保我得到一個特定的錯誤。
如何添加翻譯測試到我的規格?例如:添加I18n翻譯到rspec測試
flash[:error].should == I18n.translate 'error.discovered'
這當然不起作用。如何使它工作?
我想確保我得到一個特定的錯誤。
在我的代碼,一個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
所以我不知道你爲什麼說這是不可能的?
:O:O您的語法有效!我的不會。我猜如果你像我那樣做,你也會得到一個錯誤。不知道爲什麼會發生,但這確實是解決方案! – Spyros 2011-03-27 09:26:48
本來可能是斷言右手邊缺失的人的情況。 – 2013-12-06 17:28:07
假設在控制器中的代碼是:
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
這實際上並不實際,因爲我將不得不通過錯誤消息文本。我想只通過翻譯標識符error.discovered。 – Spyros 2011-03-27 02:11:23
在這種情況下,您不想測試翻譯庫是否工作,只是您的控制器代碼是否調用translate方法並將翻譯分配給'flash [:error]'。方法存根替換'I18n.translate'並返回塊中傳遞的值 - 錯誤消息文本本身並不重要,它可以是任何你喜歡的。 – zetetic 2011-03-27 03:53:10
我其實想檢查flash [:error]的消息是否是預期的翻譯消息。我想這樣做的原因是因爲害怕在我的rspec測試中將其與其他flash [:error]消息混合。例如,我可能會檢查用戶是否有黃金並且通過flash [:error]的測試不應該爲零。雖然測試成功了,但也可能是之前的另一個錯誤閃現。它確實發生了,並且很幸運地發現它:/ – Spyros 2011-03-27 04:06:31
不知道這是否是最佳的,但在我的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密鑰實際上都有值(並且沒有任何未使用或過時),同時保持重複測試的次數,從而減少套件運行時間。
嘗試應用程序('error.discovered')真的沒有線索,但也許你是幸運的:) – 2011-03-27 01:04:51