单元测试使用Grails中的JsonBuilder呈现Json

时间:2012-03-23 14:49:44

标签: unit-testing grails render jsonbuilder

假设我的控制器中有一个简单的动作,结尾为:

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

根据JSON构建器documentation正确呈现。但是,当我尝试在ControllerUnitTest中对该响应进行单元测试时,我得到一个带有controller.response.contentAsString的空白字符串。我甚至试过controller.renderArgs,但只包含contentType: "text/json"

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

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

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

比较结果

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

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

}

答案 2 :(得分:0)

经过多次搜索,我发现这在1.3.7中是不可能的。要么必须升级到Grails 2.0,要么按照this post中的建议覆盖控制器metaClass:

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
    }
}