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