2013-03-14 88 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相当功能,因为我的预期