4

コントローラーに次のような単純なアクションがあるとします。

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

JSONビルダーのドキュメントに従って、正しくレンダリングされます。ただし、ControllerUnitTestでその応答を単体テストしようとすると、。が付いた空白の文字列が表示されcontroller.response.contentAsStringます。私も試しcontroller.renderArgsましたが、それはただ含まれていますcontentType: "text/json"

JSONをマップに変換してマーシャリングするとas JSON、適切にテストできます。しかし、コードをそのままユニットテストする方法はありますか?

4

3 に答える 3

0

多くの検索の結果、1.3.7ではこれが不可能であることがわかりました。Grails 2.0にアップグレードするか、この投稿で提案されているようにコントローラーのメタクラスをオーバーライドする必要があります。

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
    }
}
于 2012-08-02T15:00:18.917 に答える
0

テストでアクションを呼び出し、controller.response.contentAsStringを使用して結果を比較する必要があります

したがって、テスト方法は次のようになります。

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

}
于 2012-04-10T17:17:20.890 に答える
0

このブログ投稿をご覧くださいhttp://www.lucasward.net/2011/03/grails-testing-issue-when-rendering-as.html

于 2013-06-14T06:37:55.100 に答える