2

JSON 形式で REST 要求を処理するコントローラーの統合テストを作成しようとしています。私のコントローラーは、次のように作成します。

class FooController {
    ...
    def create() {
        withFormat {
            html {
                [fooInstance: new Foo(params)]
            }
            json {
                [fooInstance: new Foo(params.JSON)]
            }
        }
    }
    ...
}

そして、次のような統合テストがあります。

@TestFor(FooController)
class FooControllerTests extends GroovyTestCase {
    void testCreate() {
        def controller = new FooController()

        controller.request.contentType = "text/json"

        // this line doesn't seem to actually do anything
        controller.request.format = 'json'

        // as of 2.x this seems to be necessary to get withFormat to respond properly
        controller.response.format = 'json'

        controller.request.content = '{"class" : "Foo", "value" : "12345"}'.getBytes()

        def result = controller.create()

        assert result

        def fooIn = result.fooInstance

        assert fooIn
        assertEquals("12345", fooIn.value)
    }
}

しかし、fooIn は常に null です。テストをデバッグすると、FooController.create() が呼び出されたときに params も空であることがわかります。確かに、統合テストが内部でどのように機能するかについてはよくわかりませんが、Foo インスタンスを表すデータが表示されることを期待していました。

何か案は?

4

1 に答える 1

0

を使用withFormatしてコンテンツをレンダリングしているため、これはコントローラー コード内のマップですが、応答は実際には文字列です。

AbstractGrailsMockHttpServletResponse必要なものを (他の便利なメソッドと共に) 提供し、controller.response はテスト中のこれのインスタンスです。

http://grails.org/doc/2.1.0/api/org/codehaus/groovy/grails/plugins/testing/AbstractGrailsMockHttpServletResponse.html#getJson()

したがって、あなたが望むのは次のようなものです:

controller.create()

def result = controller.response.json

編集:

あなたが尋ねたように、次のようにパラメーターを渡す必要があります。

controller.params.value = "12345"
controller.params.'class' = "Foo"
于 2013-03-28T17:20:52.887 に答える