Как выполнить юнит или интеграционное тестирование с использованием внедренного источника сообщений для i18n в сервисе Grails 2.0 - PullRequest
13 голосов
/ 03 февраля 2012

Я использую пакет сообщений в одном из моих сервисов в проекте 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 );      
    }

Ответы [ 3 ]

29 голосов
/ 04 февраля 2012

В модульных тестах в Grails уже есть messageSource, это 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")
4 голосов
/ 09 мая 2013

В модульных тестах и ​​локальной стороне функциональных тестов иногда вам нужны реальные свойства, которые находятся в каталоге 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)
2 голосов
/ 04 февраля 2012

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

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», тогда это не сработает.

...