2016-09-04 18 views
2

私はgrails plugin multi-tenant-single-dbを使用しています。その文脈の中で私はテナントの制限を一時的に取り除くスポークテストを書く必要があります。場所は私のテナントである、私の方法は次のようになりますので、: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

あなたがコードをそこに置くと、そのコードは実行されますが、クロージャに渡されたときの元のメソッドコードはありません。 –

関連する問題