Grails 2.2中的测试标准

时间:2013-02-06 19:56:10

标签: grails-2.0 grails-domain-class grails-2.2

我们从Grails 1.3.7迁移到2.2的原因之一是能够对我们(许多)标准进行单元测试。

我们在标准测试中遇到的第一件事是:

属性[nightly.id]不是类[com.litle.bldvwr.Result]的有效属性     at grails.gorm.CriteriaBuilder.validatePropertyName(CriteriaBuilder.java:968)

我们所拥有的是结果与夜间之间简单的多对一关系。 每个结果每晚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
        }
}

以上代码来自使用GGTS 3.1创建的全新Grails 2.2项目 除了上面的代码,项目中的其他所有内容都是完整的锅炉板生成的。

我希望,正如它对实际数据库所做的那样,'nightly.id'将被翻译成Result表的nightly_id列。

这是一个问题,如何在2.2中嘲笑GORM,还是我们错过了什么?

1 个答案:

答案 0 :(得分:1)

您应该将查询更改为

def count = Result.createCriteria().count {
        and {
            eq('nightly', nightly)
            eq('status', status)
            isNull('rerun')
        }
    }