2011-01-30 11 views
2

を含む動的ファインダーは、だから私は、Grailsのドメインクラスを持っていますgrails 1.2.1に対するSTS 2.6.0.M1の単体テストケース。 ウェブアプリケーションをスピニングすると、によってにあるhasBeenLogicallyDeletedByRecipient(これは、クエリを構築するときに動的ファインダの解析を混乱させると思われます)のために失敗します。Grailsのフィールド名は予約語

私はアプリで動作する基準ビルダー使用することができます

def messages = Message.withCriteria { 
     and { 
      eq('inbox', inbox) 
      eq('hasBeenLogicallyDeletedByRecipient', false) 
     } 
     order('dateCreated', 'desc') 
    } 

をしかしwithCriteriaが嘲笑されていないので、それはすぐにユニットテストでは動作しませんので、私はユニットテストに以下を追加することができます:

Message.metaClass.static.withCriteria = { Closure c -> 
     ... 
    } 

基準/単体テストがベスト/受け入れられたアプローチを模倣していますか?私はこれを嘲笑することで完全に快適ではないと感じました。それは、基準クロージャをテストすることを回避します。

理想的には、ダイナミックファインダーを使用するのが理想的です - それをそのまま動作させるための簡潔な方法はありますか? その周りに方法がない場合、私はフィールド名を仮定は変更することができた(私はこれを行うにはしたくないが、これは問題とは無関係である理由があります)...

UPDATE:私はアプリ内findAllByInboxAndHasBeenLogicallyDeletedByRecipient()を使用しようとすると

がここにスタックトレースだ -では最後を取得し、それとプロパティとしてのfindAllの間に他のすべてを治療するための表示方法に気づきます。私はhttp://grails.org/OperatorNamesInDynamicMethodsに雨が降ったが、それについては何も言及していませんによって verbotenされています。

org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [byInboxAndHasBeenLogicallyDeleted] for class [class xxx.Message] 
    at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController:53) 
    at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController) 
    at java.lang.Thread.run(Thread.java:662) 

答えて

2

データベースクエリのテストは、実際にはユニットテストではなく、統合テストです。あなたのテストは/ test/unitか/ test/integrationか? - 私は 'withCriteria'が統合テストで完全に機能することを期待しますが、単体テストでは機能しません。 Grailsのドキュメント(http://grails.org/doc/latest/)から

、セクション9.1:

ユニットテストは、 "ユニット" レベルでテストされています。換言すれば、 個々のメソッドまたはコードブロック を、周辺の インフラストラクチャを考慮せずにテストしています。 Grailsのでは、ユニットに テストGrailsの 統合テスト中と実行時に存在 動的メソッドのいずれかを注入していないため、ユニットと 統合テストの間 違いを意識特殊性も にする必要があります。

+0

ユニットテスト(/テスト/ユニット)です。Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(...)のスペルを間違えた場合、ダイナミックファインダに対するユニットテストは失敗しますが、基準とスペルミスペル( 'hasBeenLogicallyDeletedByRecipient'、false)を使用すると失敗します。私はそれが統合テスト時になると思います。 – rhu

+0

@rhu:要するに、Paulが指摘しているように、Dynamic Finderは単体テストでは使用できません。Grailsはその時点でそれを挿入しないためです。別の言い方をすると、findAllByConstraintは単体テストでは定義されていません。 –

+0

@HoàngLong:テスト設定でGrailsUnitTestCaseのmockDomain(Message、testData)をユニットテストデータとともに使用すると、_some_ダイナミックファインダが注入されます。決定的にfindAllByInboxAndHasBeenLogicallyDeletedByRecipient()は期待通りに応答しますが、基本的なfindAll()とwithCriteria()はそうではありません。 – rhu