を含む動的ファインダーは、だから私は、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)
ユニットテスト(/テスト/ユニット)です。Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(...)のスペルを間違えた場合、ダイナミックファインダに対するユニットテストは失敗しますが、基準とスペルミスペル( 'hasBeenLogicallyDeletedByRecipient'、false)を使用すると失敗します。私はそれが統合テスト時になると思います。 – rhu
@rhu:要するに、Paulが指摘しているように、Dynamic Finderは単体テストでは使用できません。Grailsはその時点でそれを挿入しないためです。別の言い方をすると、findAllByConstraintは単体テストでは定義されていません。 –
@HoàngLong:テスト設定でGrailsUnitTestCaseのmockDomain(Message、testData)をユニットテストデータとともに使用すると、_some_ダイナミックファインダが注入されます。決定的にfindAllByInboxAndHasBeenLogicallyDeletedByRecipient()は期待通りに応答しますが、基本的なfindAll()とwithCriteria()はそうではありません。 – rhu