假设我的控制器中有一个简单的动作,结尾为:
render(contentType: "text/json") {
message = 'some text'
foo = 'bar'
}
根据JSON构建器documentation正确呈现。但是,当我尝试在ControllerUnitTest中对该响应进行单元测试时,我得到一个带有controller.response.contentAsString
的空白字符串。我甚至试过controller.renderArgs
,但只包含contentType: "text/json"
。
当我将JSON转换为地图并对其进行编组as JSON
时,我可以正确测试。但有没有办法对代码进行单元测试?
答案 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
}
}