我在Grails 2.0項目的一個服務中使用了一個用於國際化文本的消息包。用例是一個通過郵件插件以異步方式發送的電子郵件主題,所以將它放在控制器或TagLib中是沒有意義的(考慮到通常不會訪問服務中的文本或視圖)。此代碼在我運行的Grails應用程序中正常工作,但我不知道如何測試它。如何在Grails 2.0服務中爲i18n注入messageSource的單元或集成測試使用
我想在我的defineBeans一個PluginAwareResourceBundleMessageSource
,因爲這是我運行的應用程序注入什麼,但它導致了nullpointers,因爲它似乎它需要大約插件經理一堆設置的並使得我的測試環境是不會放棄(甚至集成) 。
然後我嘗試了一個ReloadableResourceBundleMessageSource
,因爲它是純粹的Spring,但它似乎無法看到我的.properties文件,並且在代碼'my.email.subject'下找不到用於語言環境'en'的No消息。
我覺得自己正在走下一個蟲洞,因爲訪問服務中的Grails i18n沒有記錄在grails文檔中,所以如果有一個首選的方法可以做到這一點,請告訴我。
注意我的.properties文件位於標準的grails-app/i18n
位置。
測試
@TestFor(EmailHelperService)
class EmailHelperServiceTests {
void testSubjectsDefaultLocale() {
defineBeans {
//messageSource(PluginAwareResourceBundleMessageSource); Leads to nullpointers
messageSource(ReloadableResourceBundleMessageSource);
}
String expected = "My Expected subject Passed1 Passed2";
String actual = service.getEmailSubjectForStandardMustGiveGiftFromBusiness(Locale.ENGLISH, Passed1 Passed2);
assertEquals("email subject", expected, actual);
}
服務:
class EmailHelperService {
def messageSource;
public String getEmailSubject(Locale locale, String param1, String param2) {
Object[] params = [param1, param2].toArray();
return messageSource.getMessage("my.email.subject", params, locale);
}
是你的意圖,以確保你在這個測試接線正確嗎?還是你計劃爲你支持的每種語言寫一篇文章?您的上述測試是單元測試還是集成測試? – 2012-02-03 20:09:34
這個想法不是爲了檢查彈簧佈線,而是在受到支持時測試各種語言,並檢查.properties中關鍵字的正確性以及文本。爲了可讀性的目的,我簡化了參數,但是測試了它們的正確性。 – Peter 2012-02-03 23:28:56