我在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