4

假设我的控制器中有一个简单的操作,以:

render(contentType: "text/json") {
    message = 'some text'
    foo = 'bar'
}

根据 JSON builder文档,它可以正确呈现。但是,当我尝试在 ControllerUnitTest 中对该响应进行单元测试时,我得到一个带有controller.response.contentAsString. 我什至尝试过controller.renderArgs,但那只是包含contentType: "text/json".

当我将 JSON 转换为地图并对其进行编组时as JSON,我可以正确测试。但是有没有办法对代码进行单元测试呢?

4

3 回答 3

0

看看这篇博文http://www.lucasward.net/2011/03/grails-testing-issue-when-rendering-as.html

于 2013-06-14T06:37:55.100 回答
0

经过大量搜索,我发现这在 1.3.7 中是不可能的。要么必须升级到 Grails 2.0,要么按照本文中的建议覆盖控制器元类:

controller.class.metaClass.render = { Map map, Closure c ->
    renderArgs.putAll(map)

    switch(map["contentType"]) {
        case null:
            break

        case "application/xml":
        case "text/xml":
            def b = new StreamingMarkupBuilder()
            if (map["encoding"]) b.encoding = map["encoding"]

            def writable = b.bind(c)
            delegate.response.outputStream << writable
            break

        case "text/json":
            new JSonBuilder(delegate.response).json(c)
            break
        default:
            println "Nothing"
            break
    }
}
于 2012-08-02T15:00:18.917 回答
0

您必须在测试中调用该操作并使用 controller.response.contentAsString 比较结果

所以你的测试方法看起来像

void testSomeRender() {
controller.someRender()
assertEquals "jsonString", controller.response.contentAsString

}
于 2012-04-10T17:17:20.890 回答