問題

最初の投稿はこちらで、うまくいけば多くの人に関連しています。

私はドメインの統合テストを書くことに取り組んでおり、そのドメインではwithCriteria()メソッドを使ってクエリを持っています。私はネット全体を検索し、基準クエリをモックする方法についての詳細な指示を与える多くを見つけましたが、正確にテストする方法はありません。

私はmockDomain(domain,list)関数を使ってドメインをモックしようとしましたが、setUp()で使用するテスト用のドメインを設定してから基準を呼び出すと何も得られません。 私はここで同様のfindByを行い、結果を得ましたが、私が探していたものは正確ではありません。私はそれが私の質問ではないと確信していますが、基準では、いくつかの場所の基準ではサービステストでは機能しません。これまでのクエリはアプリで私のために働いていましたが、コードベースが変更された場合に後で参照できるテストをしたいと思います。

私は実際に多くの人が提案し、クエリのコードを取り出し、それを使用するテストのためにそれを模擬できるように私のドメイン内の静的メソッドにしましたが、今は実際にこの部分をテストする方法に固執しています。私はアプリを実行し、その観点から機能テストを行う必要がありますか、またはgrailsユニット/統合テストでこれを行うことができる方法があります。私は以下のクエリを投稿します。

 static Attribute getDefinitionsUsingCriteria(List categoryNames, List types){
        def definitions = Definition.withCriteria() {
            and {
                'in'('type', types)
                if (categoryNames) {
                    categories {
                        'in'('name', categoryNames)
                    }
                }
            }
        }
        return definitions
    }
 

定義には文字列プロパティ型があり、このセットの各要素にString nameプロパティがあるSet型のプロパティカテゴリがあります。

私はまだgrailsにはかなり新しく、多くの参考書を読んでいます。私はこれまでに読んだすべての本にこれが欠けていることに驚いています。私はこれが私の部分の間違いであり、簡単にテストできるものであることを願っています。私はどんな助けにも感謝し、この長い記事を読んでいただきありがとうございます。

ジェイラ

  ベストアンサー

1つの方法:テストをtest/unitからtest/integrationフォルダに移動します。基準は単体テストでは機能しません(Hibernateはありません)が、統合されます。統合テストではmockDomain()を使用しないでください。

注:メソッドを静的にするのではなく、テストを複製するだけです。

2番目の方法:単体テストでは、mockDomain()を使用します。ロジックがかなり簡単で、メソッド以外のすべてをunit-testするという事実に依存します。 setUp()で次のようにオーバーライドします。

 Definition.metaClass.getDefinitionsUsingCriteria = { List categoryNames, List types ->
    delegate.findAll{ (it.type in types) && 
        (it.categories.find { c -> c in categoryNames }) 
    }
}
 

  同じタグがついた質問を見る

testinggrailscriteria