2011-11-21 56 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對象。

此外,您的錯誤消息看起來不像第三個斷言拋出,但第一個或第二個斷言。