Подтвердить что ты не робот

Как выполнить тестирование интеграции или интеграции с помощью инъецированного messageSource для i18n в службе Grails 2.0

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

Ответ 2

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

Ответ 3

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

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