我正在学习Grails的Grails - 由Jason Rudolph的书开始。 我的域类看起来像这样:
class Race {
String name;
Date startDateTime
String city
String state
Float distance
Float cost
Integer maxRunners = 10000
static hasMany = [registrations: Registration]
static constraints = {
name(maxSize: 50, blank: false)
startDateTime(validator: {
return it > new Date()
})
city(maxSize: 30, blank: false)
state(inList: ['GA', 'NC', 'SC', 'VA'], blank: false)
distance(min: 3.1f, max: 100f)
cost(min: 0f, max: 999.99f)
}
String toString() { "${this.name} : ${this.city}, ${this.state}" }
}
我想测试startDateTime字段的自定义验证。测试看起来像这样:
class RaceTests extends GrailsUnitTestCase {
protected void setUp() {
super.setUp()
}
protected void tearDown() {
super.tearDown()
}
void testCustomDateValidation() {
def race = new Race()
race.startDateTime = null
assertFalse(race.validate())
}
}
测试看起来类似于我前面提到的那本书。但是我得到了
groovy.lang.MissingMethodException: No signature of method: racetrack.Race.validate() is applicable for argument types: () values: []
我被困住了,没有找到任何解决方案:/任何帮助将不胜感激。
答案 0 :(得分:5)
你错过了mockForConstraintsTests()调用。常见的模式是在setUp()
中执行此操作protected void setUp() {
super.setUp()
mockForConstraintsTests(Race)
}
详细信息:http://mrhaki.blogspot.com/2009/04/unit-testing-constraints-in-domain.html
答案 1 :(得分:3)
您不应使用单元测试或模拟来测试域类。 Grails确实为域类创建了一个单元测试,这应该改变。将类移动到test / integration下的同一个包和文件夹中,并将基类更改为GroovyTestCase,您将拥有一个与内存数据库一起运行并测试持久性的正确测试,而不是模拟框架。