Я использую набор сообщений в одной из моих служб в проекте Grails 2.0 для интернационализированного текста. Вариант использования - это тема электронной почты, которая отправляется через почтовый плагин асинхронным способом, поэтому нет смысла иметь это в контроллере или TagLib (учитывая обычный аргумент о том, что вы не получаете доступ к вашему тексту или представлениям в службе). Этот код отлично работает в моем приложении Grails, но я не уверен, как его протестировать.
Я попробовал PluginAwareResourceBundleMessageSource
в моем defineBeans, так как это то, что я использую для запуска моего приложения, но оно привело к нулевым указателям, поскольку, по-видимому, ему нужна куча настроек для менеджеров плагинов и такая, что моя тестовая среда не дает (даже интеграция).
Затем я попробовал a ReloadableResourceBundleMessageSource
, поскольку он был чистым Spring, но он, похоже, не может видеть мои файлы .properties и не получается с сообщением No, найденным в коде 'my.email.subject' для locale ' ан".
Мне кажется, что я немного погуляю по червоточине, поскольку доступ к 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 );
}