Grails 1.3.7から2.2に移行する理由の1つは、(多くの)基準を単体テストできることです。
そして、基準テストで最初に遭遇したのはこれです:
プロパティ[nightly.id]は、grails.gorm.CriteriaBuilder.validatePropertyName(CriteriaBuilder.java:968)のクラス[com.litle.bldvwr.Result]の有効なプロパティではありません。
私たちが持っているのは、結果と夜間の単純な多対1の関係です。各結果には毎晩1つあります。NightlyとResultの間に直接の関係はありません。
更新しました
具体的なコードは次のとおりです。Nightly.groovy:
package examples
import java.util.Date;
class Nightly {
String name
String status
static constraints = {
status nullable:true
name unique: true, nullable: false, blank: false
}
static mapping = {
}
String toString () {
name +' ' + status
}
}
Result.groovy:
package examples
import java.util.Date;
class Result {
String status
String name
String type
Nightly nightly
static mapping = {
}
Result() {
}
static def gimmeCountByNightlyAndStatusAndRerunIsNull(def nightly, def status) {
def count = Result.createCriteria().count {
and {
eq('nightly.id', nightly.id)
eq('status', status)
isNull('rerun')
}
}
return count
}
}
ResultTests.groovy
package examples
import grails.test.mixin.*
import org.junit.*
@TestFor(Result)
@Mock(Nightly)
class ResultTests {
void testCriteriaMess () {
//this test will fail due to: Property [nightly.id] is not a valid property of class [examples.Result]
Nightly night = new Nightly( name:'nightly1', status:'Success')
night.save(validate:false)
Result res = new Result(status: 'SUCCESS', type: 'INTEGRATION')
res.nightly = night
res.save(validate:false, flush:true)
def count = Result.gimmeCountByNightlyAndStatusAndRerunIsNull(night, 'SUCCESS')
assertTrue count==0
}
}
上記のコードは、GGTS3.1で作成された新しいGrails2.2プロジェクトからのものです。上記のコードを除いて、プロジェクト内の他のすべては完全なボイラープレートが生成されています。
実際のデータベースと同様に、「nightly.id」はResultテーブルのnightly_id列に変換されると思います。
これは、2.2でGORMがどのようにモックされているかに関する問題ですか、それとも何かが足りないのでしょうか。