测试控制器响应时出错。响应未更新

时间:2011-11-21 13:19:33

标签: grails integration-testing

我正在尝试测试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 个答案:

答案 0 :(得分:2)

在创建Controller时注入MockHttpServletResponse,而不是在每个控制器动作调用之前注入。

在一次测试中多次调用控制器方法时,所有调用都使用相同的注入响应。根据我的理解,render()方法不会覆盖以前呈现的响应,但会附加到它 - 因此,在您的示例中,当您第三次调用enable()时,响应已包含在先前调用时呈现的json对象。

此外,您的错误消息看起来不像是第三个断言引发的,而是第一个或第二个断言。