簡體   English   中英

如何單元測試grails的消息標記

[英]how to unit test grails' message tag

在控制器中有一個動作:

    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]]):

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

研究之后,應該在安裝過程中調用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測試。
在運行階段(不是測試),
在控制器類中調用“message”會導致調用ValidationTagLib類的“message”,
但它們在單元測試階段沒有約束力。
所以我對ValidationTagLib的“消息”做了幾乎相同的邏輯,
並將它(名為“mockMessage”)綁定到controller.message。
使用此代碼,您可以在測試中的控制器類中正確執行“消息”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM