Ошибка при тестировании ответа контроллера. Ответ не обновляется - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь проверить поведение контроллера Grails. Контроллеры отвечают с помощью объекта JSON. Следующая функция завершается ошибкой

void testEnable() {
    def controller = new UserController()
    controller.enable()
    assertEquals('{"errors":"No se puede completar la petición porque faltan parametros"}', controller.response.contentAsString)

    controller.params.enabled = "foo"
    controller.enable()
    assertEquals('{"errors":"No se puede completar la petición porque faltan parametros"}', controller.response.contentAsString)

    controller.params.enabled=true
    controller.params.id=2
    controller.enable()
    /* Next line fails */
    assertEquals('{"errors":"No se ha encontrado al usuario"}', controller.response.contentAsString)
}

Я получаю следующую ошибку:

null expected:<{"errors":"No se [ha encontrado al usuario]"}> but was:<{"errors":"No se [puede completar la petición porque faltan parametros]"}>

Однако Если я разделю тест на две функции, обе функции пройдут .

void testEnableGoodParameters() {
        def controller = new UserController()
        controller.params.enabled=true
        controller.params.id=2
        controller.enable()
        assertEquals('{"errors":"No se ha encontrado al usuario"}', controller.response.contentAsString)
    }

    void testEnableBadParameters() {
        def controller = new UserController()
        controller.enable()
        assertEquals('{"errors":"No se puede completar la petición porque faltan parametros"}', controller.response.contentAsString)

        controller.params.enabled = "foo"
        controller.enable()
        assertEquals('{"errors":"No se puede completar la petición porque faltan parametros"}', controller.response.contentAsString)
    }

Итак, похоже на controller.response ничего не меняется. Кто-нибудь знает, почему это происходит и как обойти это?

1 Ответ

2 голосов
/ 21 ноября 2011

A MockHttpServletResponse вводится при создании контроллера, а не перед каждым вызовом действия контроллера.

Когда вы вызываете метод контроллера более одного раза в одном тесте, все вызовы используют один и тот же введенный ответ. Из того, что я понимаю, метод render () не перезаписывает ранее обработанный ответ, а добавляет к нему - так что, в вашем примере, когда вы вызываете enable() в третий раз, ответ уже содержит объекты json, отображаемые при предыдущих вызовах.

Кроме того, ваше сообщение об ошибке выглядит не так, как если бы оно было выбрано третьим утверждением, а первым или вторым.

...