2011-11-21 155 views
0

我想测试一个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没有被改变。有谁知道为什么会发生这种情况,以及如何解决这个问题?

回答

2

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

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

此外,您的错误消息看起来不像第三个断言抛出,但第一个或第二个断言。