Unit testing 在Grails中使用JsonBuilder进行单元测试呈现Json

Unit testing 在Grails中使用JsonBuilder进行单元测试呈现Json,unit-testing,grails,render,jsonbuilder,Unit Testing,Grails,Render,Jsonbuilder,假设我的控制器中有一个简单的动作,以: render(contentType: "text/json") { message = 'some text' foo = 'bar' } 它按照JSON生成器正确呈现。但是,当我尝试在ControllerUnitTest中对该响应进行单元测试时,我会得到一个带有controller.response.contentAsString的空白字符串。我甚至尝试了controller.renderags,但它只包含contentType:“t

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

render(contentType: "text/json") {
    message = 'some text'
    foo = 'bar'
}
它按照JSON生成器正确呈现。但是,当我尝试在ControllerUnitTest中对该响应进行单元测试时,我会得到一个带有
controller.response.contentAsString
的空白字符串。我甚至尝试了
controller.renderags
,但它只包含
contentType:“text/json”


当我将JSON转换成一个映射,并将其作为JSON进行处理时,我就可以正确地进行测试了。但是有没有一种方法可以按原样对代码进行单元测试?

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

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

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

}

经过多次搜索,我发现这在1.3.7中是不可能的。要么必须升级到Grails 2.0,要么按照以下建议重写控制器元类:

controller.class.metaClass.render={Map-Map,闭包c->
renderArgs.putAll(地图)
开关(映射[“contentType”]){
大小写为空:
打破
案例“应用程序/xml”:
案例“text/xml”:
def b=新的StreamingMarkupBuilder()
if(map[“encoding”])b.encoding=map[“encoding”]
def writable=b.bind(c)

delegate.response.outputStream看看这篇博文

我试过了,但正如我提到的,我只得到了一个空白字符串(或者它包含“contentType:'text/json',我记不得了)我刚刚为一个操作添加了一个代码,该操作返回JSON字符串,就像您正在尝试做的那样,但我没有看到任何内容。因此,问题在于内容没有呈现。您使用的是什么版本的Grails?1.3.7,我知道2.0有更好的支持,但不幸的是,我无法切换到该操作。:-\1.3.7是一个比2.0更稳定的版本。2.3不应该是这样直到10月,他们已经完成了错误修复。我认为JSON转换器不会将任何字符串对象转换为JSON,从而返回空字符串。我尝试过的一件事是创建一个Expando对象,并向其添加属性,然后对其进行渲染,结果成功了。我想你应该尝试一下。希望helpsBroken链接,404。
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
    }
}