2016-09-04 4 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은 전체 메서드 로직을 감싸는 래퍼입니다.

업데이트 : 테스트 코드는 다음과 같습니다

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

예! 런타임에 컴파일 될 때 생성되는 것처럼 stubbing해야합니다. 당신은 아래처럼 스텁 수 :

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

일반 코드가 테스트 케이스에서 작동이 방법. 또한 withoutTenantRestriction에서와 같이 기본적으로 새로운 최대 절전 모드 세션을 시작합니다. 이제는 최대 절전 모드 세션을 시작합니다. 이제는 클로저를 스텁 했으므로 closure.call() 대신에 원하는 작업을 수행 할 수 있습니다.

또한, withThisTenant에도 동일하게 적용될 수있다.

통합 테스트에서 전체 환경을로드 할 때 스텁하지 않아도됩니다.

희망이 있습니다!

+0

'closure.call()'을 수행 할 코드로 바꾸는 것에 관한 질문입니다. 원래의 방법이 변경되었거나 실패 할 경우 테스트가 실패합니까? – TroyB

+0

글쎄, 코드를 거기에 넣으면 그 코드는 실행되지만 클로저에 전달 된 원래의 메소드 코드는 없다. –