Проверяемые Grails не работают для непостоянного класса домена
Я следовал инструкции здесь: http://www.grails.org/doc/latest/guide/7.%20Validation.html
и добавил в config.groovy:
grails.validateable.classes = [liningtest.Warm']
Затем добавлен в src / groovy / Warm.groovy (это непостоянный класс домена):
package liningtest
import org.codehaus.groovy.grails.validation.Validateable
class Warm {
String name;
int happyCite;
Warm(String n, int h) {
this.name = n;
this.happyCite = h;
}
static constraints = {
name(size: 1..50)
happyCite(min: 100)
}
}
Но это просто не работает (как "пустое", так и "size: 0..25") для функции hasErrors. Он всегда возвращает false, даже если имя> 25.
Это ошибка Grails, если да, есть ли обходной путь?
Я использую Grails 1.3.3
ОБНОВЛЕНИЕ: я обновил упрощенный код. И теперь я знаю, что ограничение "размер" нельзя использовать с "пустым", но все равно не работает.
Мой тестовый класс в test/unit/liningtest/WarmTests.groovy
package liningtest
import grails.test.*
class WarmTests extends GrailsUnitTestCase {
protected void setUp() {
super.setUp()
}
protected void tearDown() {
super.tearDown()
}
void testSomething() {
def w = new Warm('Hihi', 3)
assert (w.happyCite == 3)
assert (w.hasErrors() == true)
}
}
И ошибка, которую я получил:
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="1" failures="0" hostname="evolus-50b0002c" name="liningtest.WarmTests" tests="1" time="0.062" timestamp="2010-12-16T04:07:47">
<properties />
<testcase classname="liningtest.WarmTests" name="testSomething" time="0.062">
<error message="No signature of method: liningtest.Warm.hasErrors() is applicable for argument types: () values: []
Possible solutions: hashCode()" type="groovy.lang.MissingMethodException">groovy.lang.MissingMethodException: No signature of method: liningtest.Warm.hasErrors() is applicable for argument types: () values: []
Possible solutions: hashCode()
at liningtest.WarmTests.testSomething(WarmTests.groovy:18)
</error>
</testcase>
<system-out><![CDATA[--Output from testSomething--
]]></system-out>
<system-err><![CDATA[--Output from testSomething--
]]></system-err>
</testsuite>
ОБНОВЛЕНИЕ 2: Когда я не использую модульный тест, но пытаюсь вызвать hasErrors в контроллере, он запускается, но возвращает ложное значение. (hasErrors возвращает false с Warm('Hihi', 3)). У кого-нибудь есть подсказка?
ОБНОВЛЕНИЕ 3: Я следовал за Виктором, и теперь проблема решена, если я вызову validate() перед hasErrors(). Но я до сих пор не понимаю, почему контроллеры "grails generate-all" не должны вызывать validate() перед использованием hasErrors()?
2 ответа
Вам действительно нужно позвонить validate()
before - запускает проверку и изменяет состояние объекта. Смотря на ValidationGrailsPlugin.addValidationMethods()
Я вижу, что hasErrors() - это метод только для чтения.
Ваш образец сработал для меня после вызова validate(). Я пробовал в grails console
(отличный инструмент, я очень рекомендую его!)
Warm w = new Warm('')
w.hasErrors() // 'Result: false'
w.validate()
w.hasErrors() // 'Result: true'
я добавил @Validateable
Теплый класс. Я считаю, что это не имеет значения.
Я не думаю, что validate()
а также hasErrors()
динамические методы добавляются в модульном тесте. Если вы перенесете это в интеграционный тест, они должны быть там.