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 チェックをクロージャーでラップして明示的に render を呼び出さない限り、常に空の応答が返されます。
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
誰かがこの不一致を説明できますか、またはテストでそれを回避するにはどうすればよいですか?