テンプレートを呼び出してステータス付きの履歴アイテムのリストを表示するGrails2.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]
}
テンプレートには、各列に値を入れてリストを反復処理するコードが含まれています。これらの項目の1つは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()が呼び出されたときにnullポインタを取得しています。
モックドメインオブジェクトとモックサービスの両方を設定しましたが、これらがこのレベルに到達しているかどうか、または間違って呼んでいる可能性があります。
@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")
}
コントローラを呼び出す前にモックビューを設定し、その応答テキストを確認しようとしましたが、まだテンプレートを処理しようとしているため、コントローラへの呼び出しを通過することはありません。この時点で、このコントローラー機能をテストする方法について迷っています。それとも、オブジェクトが適切に設計されていなかったのでしょうか。これは少し複雑すぎるようです。