我们从 Grails 1.3.7 迁移到 2.2 的原因之一是能够对我们的(许多)标准进行单元测试。
我们在标准测试中遇到的第一件事是:
属性 [nightly.id] 不是 grails.gorm.CriteriaBuilder.validatePropertyName(CriteriaBuilder.java:968) 中类 [com.litle.bldvwr.Result] 的有效属性
我们所拥有的是 result 和 nightly 之间简单的多对一关系。每个结果每晚有 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
}
}
结果.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
}
}
上面的代码来自一个全新的 Grails 2.2 项目,它是用 GGTS 3.1 创建的。除了上面的代码,项目中的其他所有内容都是完整的样板生成的。
我希望,正如它针对实际数据库所做的那样,“nightly.id”将被转换为 Result 表的 nightly_id 列。
这是 GORM 在 2.2 中如何被嘲笑的问题,还是我们遗漏了什么?