在 Grails 2.1.1 应用程序中,我正在尝试对使用“withFormat”将响应呈现为 HTML 或 JSON 的控制器进行单元测试。然而,对 HTML 内容类型的响应总是会在我的测试中产生一个空响应,除非我将它包装在一个闭包中并显式调用“render”。对于 JSON,它会发回预期的响应。
控制器:
import grails.converters.JSON
class TestController {
def formatWithHtmlOrJson() {
withFormat {
html someContent:"should be HTML"
json {render new Expando(someContent:"should be JSON") as JSON}
}
}
测试:
@TestFor(TestController)
class TestControllerTests {
void testForJson() {
response.format = "json"
controller.formatWithHtmlOrJson()
println("resp: $response.contentAsString")
assert response.json.properties.someContent == "should be JSON"
}
void testForHtml() {
response.format = "html"
controller.formatWithHtmlOrJson()
println("resp: $response.contentAsString")
// fails here, response is empty
assert response.text
//never gets this far
assert response.contentAsString.contains("HTML")
}
}
如上所述,对于 JSON,这是可行的,但对于 HTML,我总是得到一个空响应,除非我将 html 检查包装在一个闭包中并显式调用渲染,如下所示:
withFormat {
html {
render someContent:"should be HTML"
}
文档建议我不需要这样做,例如:
withFormat {
html bookList: books
js { render "alert('hello')" }
xml { render books as XML }
}
来自http://grails.org/doc/2.2.x/ref/Controllers/withFormat.html
令人沮丧的是,关于测试的 grails 文档提到了 withFormat 的使用,但只给出了测试 xml/json 的示例,而没有给出 html 响应的示例。
http://grails.org/doc/latest/guide/testing.html#unitTestingControllers
谁能解释这种差异,或者我如何在测试中解决它?