unit-testing - 如何对 Grails 的消息标签进行单元测试

标签 unit-testing grails message taglib

在 Controller 中有一个 Action :

    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() is applicable for argument types: (java.util .LinkedHashMap) 值:[[code:chocolateBar.label, default:ChocolateBar]]):

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

经过研究,应该在设置过程中调用一个mockTagLib方法。但是没有找到内置消息(..)的正确类名。请帮忙。

最佳答案

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

//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 测试,但 main idea 也可用于普通的 grails 测试。
在运行阶段(非测试),
在 Controller 类中调用“消息”导致调用 ValidationTagLib 类的“消息”,
但它们在单元测试阶段没有绑定(bind)。
所以我对 ValidationTagLib 的“消息”做了几乎相同的逻辑,
并将它(命名为“mockMessage”)绑定(bind)到 controller.message.
使用此代码,您可以在测试中的 Controller 类中正确执行“消息”。

关于unit-testing - 如何对 Grails 的消息标签进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20795376/

相关文章:

iphone - 如何在 iPhone 中自定义消息撰写屏幕?

android - Android 中的全局消息池是什么?它驻留在内存中的什么位置?

php - PHPSpec 中的单元测试 UploadedFile.php

java - IntelliJ 理念 : JUnit Test Class template depending on condition

python - 将 Unittest 输出记录到文本文件

grails - Groovy/Grails使用WSClient消耗.net Web服务

javascript - 如何在调用时从 spy.on(object, 'funcName') 返回虚假数据?

groovy - 引用 Grails GORM 中的引用表的域对象

grails - 如何在 Grails 中配置 Quartz 触发器以允许不同的测试和生产计划

iOS : how to fill a field if user gets a text message from our service?