2016-09-04 59 views
2

我正在使用grails plugin multi-tenant-single-db。在這種情況下,我需要編寫一個spock測試,我們暫時刪除租戶限制。位置是我的房客,所以我的方法是這樣的:Spock當測試方法包含關閉時測試

def loadOjectDetails(){ 
     Location.withoutTenantRestriction{ 
      // code here to retrieve specific items to the object to be loaded 
      render(template: "_loadDetails", model:[ ... ] 
     } 
} 

的方法運行正常,但試圖把方法下的測試覆蓋率的錯誤輸出提示:

groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types: 

和堆棧跟蹤該源於此。

我需要存根嗎? withoutTenantRestriction是我整個方法邏輯的一個包裝。

UPDATE: 測試代碼如下所示:

given: 
    params.id = 3002 
    currentUser = Mock(User) 
    criteriaSetup() 
    controller.getSalesOrder >> salesOrders[2] 

    when: 
    controller.loadOrderManageDetails() 

    then: 
    (1.._) controller.springSecurityService.getCurrentUser() >> currentUser 


    expect: 
    view == 'orderMange/orderManageDetail' 
    model.orderInstance == salesOrders[2] 
+0

測試代碼是什麼樣的? – railsdog

+0

我按照要求用我的測試代碼更新了這個問題 – TroyB

回答

0

是的!你應該在運行時創建它,而不是編譯時。 你可以存根它象下面這樣:

Your_Domain.metaClass.withoutTenantRestriction{Closure closure -> 
      closure.call() 
} 

這樣你的常規代碼將在測試情況下工作。另外,正如在withoutTenantRestriction中,它基本上啓動了一個新的休眠會話,與現在您已閉合閉包無關,您可以執行所需的操作,而不是僅調用closure.call()

此外,withThisTenant也可以應用。

在集成測試中,您不需要像加載整個環境那樣對它進行存根。

希望它有幫助!

+0

只需要用將要執行的代碼替換'closure.call()'的問題。當原始方法改變時,測試會失敗嗎? – TroyB

+0

那麼,如果你把代碼放在那裏,代碼將被執行,但沒有原始的方法代碼,因爲它傳遞給閉包。 –