Grails - тестирование пользовательского валидатора на проблему класса домена
Я изучаю Grails из Grails - начало работы с книгой Джейсона Рудольфа. Мой класс домена выглядит так:
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: []
Я застрял и не нашел никакого решения:/ Любая помощь будет оценена.
2 ответа
Вы не должны использовать модульные тесты или макеты для проверки классов домена. Grails создает модульный тест для классов доменов, и это следует изменить. Переместите класс в тот же пакет и папку в тесте / интеграции и измените базовый класс на GroovyTestCase, и вы получите надлежащий тест, который работает с базой данных в памяти и проверяет постоянство, а не среду для моделирования.
Вам не хватает вызова mockForConstraintsTests(). Общий шаблон заключается в том, чтобы сделать это в setUp()
protected void setUp() {
super.setUp()
mockForConstraintsTests(Race)
}
Для деталей: http://mrhaki.blogspot.com/2009/04/unit-testing-constraints-in-domain.html