如何在Grails 2.0服务中对i18n注入的messageSource进行单元或集成测试

时间:2012-02-03 19:40:50

标签: testing grails service internationalization grails-2.0

我在Grails 2.0项目的一个服务中使用消息包来获取国际化文本。用例是一个通过邮件插件以异步方式发送的电子邮件主题,因此在控制器或TagLib中使用它是没有意义的(考虑到通常的参数是不访问服务中的文本或视图) )。这段代码在我运行的Grails应用程序中运行良好,但我不确定如何测试它。

我在我的defineBeans中尝试了PluginAwareResourceBundleMessageSource,因为这是我正在运行的应用程序注入的内容,但它导致了nullpointers,因为它看起来需要围绕插件管理器进行一系列设置,这样我的测试环境就不会给出(甚至整合)。

然后我尝试了一个ReloadableResourceBundleMessageSource,因为它是纯粹的Spring,但它似乎无法看到我的.properties文件,并且在代码'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 );      
    }

3 个答案:

答案 0 :(得分:29)

在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")

答案 1 :(得分: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)

答案 2 :(得分: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”,那么这对您无效。