2013-03-14 92 views
0

試圖單元測試一個調用模板的Grails 2.1.x控制器,以顯示具有狀態的歷史項目列表。這個控制器在手動測試中工作正常,但試圖自動化事情,並且我陷入了這一部分。我們的問題的一部分可能是域對象過度設計。Grails 2.1.x控制器單元通過服務測試

此測試的設置可能是更多的集成,而不是單元測試,但我不確定我可以用它來測試函數。

控制器操作通過createCriteria查詢生成歷史記錄項目列表。該列表被傳遞給要呈現的模板。

def loadHistValues(){ 
    def histDomainObject = new historyDom() 
    def elements = histDomainObject.createCriteria().list(max: params.max, offset: params.offset) 
    render (template: 'searchResults', model:[elements: elements] 
    } 

該模板的代碼遍歷整個列表,將值放入每列中。其中一個項目是getStatus()。這會調用一個實用程序服務來返回值。

def getStatus(){ 
    return historyUtillityService.getStatus(this) 
} 

服務獲取最新的歷史事件並返回值。

def getStatus(HistoryDom hist){ 
    def histStatus = HistoryEvent.createCriteria().get(
     maxResults(1) 
     order('id', 'desc') 
     eq('historyDom', hist) 
    ) 
     if (histStatus == null) 
      return 0 
     else 
      return histStatus.status 
    } 

當getStatus()被調用時,我得到一個空指針。

我已經設置了模擬域對象和模擬服務,但我不確定這些是否會降低到這個水平,或者我可能會錯誤地稱它們爲錯誤。

@TestFor (HistoryController) 
@MockFor (HistoryDom, HistoryEventDom) 

class HistoryControllerTests{ 

def util = new UnitTestUtil() 

void testLoadHistValues(){ 
    def mockHistoryUtilityService = mockfor (HistoryUtilityService) 
    mockHisotryUtilityService.demand.getStatus (-> return Status.QUEUED) 

    def histObj1 = util.initMockHistObj(1) 
    def histObj2 = util.initMockHistObj(2) 

    histObj1.save() 
    histObj2.save() 

    def mockHistEvent = new HistEvent(
     histDate: histObj1.getHistDate(), 
     histObj: histObj1, 
     histStatus: Status.QUEUED 
    ) 

    mockHistEvent.save() 

    controller.loadHistValues() 

    assert response.text contains("Something worth testing") 
} 

我試圖調用控制器之前,設置一個模擬的視圖和檢查,響應文本,但它從來沒有得到過呼叫控制器自仍然試圖處理的模板。至於如何測試這個控制器功能,或者是否該對象沒有正確構建,我現在處於虧損狀態;這似乎有點過於複雜。

回答

0

答案是在模擬GORM完全保存之前嘲弄約束測試的東西。我想mockForConstraintsTests dosnt相當功能,因爲我的預期