Юнит-тестирование рендеринга Json с помощью JsonBuilder в Grails - PullRequest
4 голосов
/ 23 марта 2012

Допустим, у меня есть простое действие в контроллере, которое заканчивается на:

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

Это правильно отображается в соответствии с JSON Builder Документация .Однако, когда я пытаюсь выполнить модульное тестирование этого ответа в ControllerUnitTest, я получаю пустую строку с controller.response.contentAsString.Я даже попробовал controller.renderArgs, но он содержит contentType: "text/json".

Когда я преобразую JSON в карту и маршаллизирую ее as JSON, тогда я могу выполнить тестирование правильно.Но есть ли способ модульного тестирования кода в его нынешнем виде?

Ответы [ 3 ]

1 голос
/ 14 июня 2013

Посмотрите на эту запись в блоге http://www.lucasward.net/2011/03/grails-testing-issue-when-rendering-as.html

0 голосов
/ 02 августа 2012

После долгих поисков я обнаружил, что это невозможно в 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
    }
}
0 голосов
/ 10 апреля 2012

Вы должны вызвать действие в своих тестах и ​​сравнить результаты, используя controller.response.contentAsString

чтобы ваш метод теста выглядел как

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

}
...