2012-02-03 2 views
12

Я использую пакет сообщений в одной из моих служб в проекте Grails 2.0 для интернационализированного текста. Вариант использования - это тема электронной почты, которая отправляется через почтовый плагин асинхронным способом, поэтому нет смысла иметь это в контроллере или TagLib (учитывая обычный аргумент о том, что вы не получаете доступ к вашему тексту или представлениям в службе). Этот код отлично работает в моем приложении Grails, но я не уверен, как его протестировать.Как использовать тестирование интеграции или интеграции с помощью инъецированного messageSource для i18n в службе Grails 2.0

Я попытался использовать PluginAwareResourceBundleMessageSource в моем defineBeans, поскольку это то, что вводит мое запущенное приложение, но оно привело к нулевым указателям, поскольку, по-видимому, ему нужна куча настроек вокруг менеджеров плагинов и такая, что моя тестовая среда не дает (даже интеграцию) ,

Я тогда попробовал ReloadableResourceBundleMessageSource, поскольку это была чистая Весна, но она не может показаться, что я вижу мои .properties файлы, и не удается с сообщением Нет, найденным под кодом 'my.email.subject' для locale '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);  
    } 
+0

Ваша цель, чтобы убедиться, что вы подключены правильно с этим один тест? Или вы планируете писать один для каждого языка, который вы поддерживаете? Также является ли ваш тестовый тест модульным тестом или тестом интеграции? –

+0

Идея была меньше, чтобы проверить весеннюю проводку, но больше для проверки на разных языках по мере их поддержки, а также для проверки правильности ключа в свойствах и тексте. Я упростил параметры с целью удобочитаемости, но проверял их правильность. – Peter

ответ

27

Существует уже messageSource в модульных тестах в Grails, это StaticMessageSource (см http://static.springsource.org/spring/docs/2.5.4/api/org/springframework/context/support/StaticMessageSource.html), вы можете добавить фиктивные сообщения с помощью метода addMessage:

messageSource.addMessage("foo.bar", request.locale, "My Message") 
+0

Спасибо, хорошо известно - можно ли проверять параметры с помощью StaticMessageSource и Message с заполнителями стиля {0}? – Peter

+0

Чтобы ответить на мой собственный комментарий, протестирован с помощью заполнителей и отлично работает. Благодарю. – Peter

+3

Я знаю, что этот вопрос устарел, но мне было удобно, чтобы я оказался на правильном пути. Вот мое решение для издевательства источника сообщений для тестирования. Во-первых, я получил messageSource: 'MessageSource messageSource = getMessageSource()' Это правда, что messageSource находится в модульных тестах, но он пуст. Таким образом, я сделал так, как @Graem Rocher рекомендует и заполняет messageSource соответствующими сообщениями для этого теста. 'messageSource.addMessage (" messageService.sms.aNumber.recovery.message ", Locale.default," {0}, ваш A-номер {1} ")' – CheddarMonkey

2

В модульном тесте вы могли убедиться, что вы подключены правильно делать что-то вроде этого:

void testSubjectsDefaultLocale() { 
    def messageSource = new Object() 
    messageSource.metaClass.getMessage = {subject, params, locale -> 
     assert "my.email.subject" == subject 
     assert ["Passed1", "Passed2"] == params 
     assert Locale.ENGLISH == locale 
     "It Worked!!!" 
    } 
    service.messageSource = messageSource 
    String actual = service.getEmailSubjectForStandardMustGiveGiftFromBusiness(Locale.ENGLISH, Passed1 Passed2) 
    assert "It Worked!!!" == actual 
} 

Этот поможет вам правильно подключиться, но не гарантирует, что то, что вы делаете, действительно работает. Если вам это нравится, тогда это сработает для вас. Если вы пытаетесь проверить, что, когда вы даете «XYZ» вашему файлу .properties, он возвращает «Hello», тогда это не сработает для вас.

+0

Спасибо за идею. Меня меньше волнует весенняя проводка, но я бы хотел загрузить мой фактический файл grails .properties (либо напрямую, либо через Spring), а не объявить его в тесте, так как тестирование содержимого и правильности ключа - это то, что я хочу. – Peter

4

В модульных тестах и ​​локальная сторона функционального тесты, иногда вам нужны реальные свойства, которые находятся в каталоге 18n.

Это работает для меня:

MessageSource getI18n() { 
    // assuming the test cwd is the project dir (where application.properties is) 
    URL url = new File('grails-app/i18n').toURI().toURL() 
    def messageSource = new ResourceBundleMessageSource() 
    messageSource.bundleClassLoader = new URLClassLoader(url) 
    messageSource.basename = 'messages' 
    messageSource 
    } 

    i18n.getMessage(key, params, locale)