Unit testing 如何对grails进行单元测试&x27;消息标签

Unit testing 如何对grails进行单元测试&x27;消息标签,unit-testing,grails,message,taglib,Unit Testing,Grails,Message,Taglib,在控制器中有一个操作: def delete = { withDomain { it.delete() flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'chocolateBar.label', default: 'ChocolateBar'), it.name])}" redirect action: 'list'

在控制器中有一个操作:

    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:没有方法签名:longtest.ChocolateBarController.message()适用于参数类型:(java.util.LinkedHashMap)值:[[code:chocolateBar.label,默认值:chocolateBar]]:


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

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

//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。

有了这段代码,您可以在测试中的控制器类中正确执行“message”

发现此问题:已回答,但答案不清楚:tagLib不是**ControllerTests的属性。我没有具体说明,但在调用操作后访问controller.flashMessage时会发生什么?我也没有想到这个问题。具有包含
消息(..)
(来自内置Grails标记库?)的操作的控制器正在测试中,然后抛出MissingMethodException。
//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
}