我正在尝试测试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没有改变。有谁知道为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:2)
在创建Controller时注入MockHttpServletResponse
,而不是在每个控制器动作调用之前注入。
在一次测试中多次调用控制器方法时,所有调用都使用相同的注入响应。根据我的理解,render()方法不会覆盖以前呈现的响应,但会附加到它 - 因此,在您的示例中,当您第三次调用enable()
时,响应已包含在先前调用时呈现的json对象。
此外,您的错误消息看起来不像是第三个断言引发的,而是第一个或第二个断言。