【问题标题】:how to unit test grails' message tag如何对 grails 的消息标签进行单元测试
【发布时间】:2014-01-14 17:33:45
【问题描述】:

在控制器中有一个动作:

    def delete = {
    withDomain {
        it.delete()
        flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'chocolateBar.label', default: 'ChocolateBar'), it.name])}"
        redirect action: 'list'
    }
}

可以在开发中测试。而在单元测试中,message(..) 方法抛出异常( groovy.lang.MissingMethodException: No signature of method: longtest.ChocolateBarController.message() 适用于参数类型:(java.util .LinkedHashMap) 值:[[code:chocolateBar.label, default:ChocolateBar]]):

    public void testDelete() {
    controller.params.id = '3'
    controller.delete()
    assert 'list'==controller.redirectArgs.action
}

经过研究,应在设置期间调用 mockTagLib 方法。但是找不到内置消息(..)的正确类名。请帮忙。

【问题讨论】:

  • 找到了这个问题:stackoverflow.com/questions/6176930/… 已回答,但答案不清楚:tagLib is not a property of **ControllerTests.
  • 我没有具体做这个,但是当你调用action之后访问controller.flashMessage会发生什么?
  • 我也没想过这个问题。包含message(..)(来自内置 Grails 标记库?)的操作的控制器正在测试中,然后抛出 MissingMethodException。

标签: unit-testing grails message taglib


【解决方案1】:

我已经解决了单元控制器测试中的问题。像这样:

//This is inside Spock test

@Shared
ResourceBundleMessageSource messageSource = null

@Shared
Closure mockMessage = {Map map ->
    return messageSource.getMessage((String)map.code, (Object[])map.args, Locale.default)
}

def setupSpec(){
    URL url = new File('grails-app/i18n').toURI().toURL()
    messageSource = new ResourceBundleMessageSource()
    messageSource.bundleClassLoader = new URLClassLoader(url)
    messageSource.basename = 'messages'
    messageSource.setDefaultEncoding("utf-8")
}

def setup(){
    controller.metaClass.message = mockMessage
}

此代码用于 spock 测试,但主要思想也可用于普通 grails 测试。
在运行阶段(非测试),
在控制器类中调用“消息”会导致调用 ValidationTagLib 类的“消息”,
但它们在单元测试阶段没有绑定。
所以我对ValidationTagLib的“消息”做了几乎相同的逻辑,
并将它(名为“mockMessage”)绑定到controller.message。
使用此代码,您可以在测试的控制器类中正确执行“消息”。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多