Граальс варьируется не работать для непревзойденного класса доменов

StackOverflow https://stackoverflow.com/questions/4448556

  •  10-10-2019
  •  | 
  •  

Вопрос

Я следовал инструкции здесь: http://www.grails.org/doc/latest/guide/7.%20validation.html

и добавлен в config.grovy:

grails.validateable.classes = [liningtest.Warm']

Затем добавлено src/groovy/теплый.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)
  }
}

Но это просто не работает (оба «пустой ложно» и «размер»: 0..25 ») для функции« Haserrors ». Он всегда возвращает ложь, даже когда имя> 25.

Это ошибка Grails, если да, есть ли какая-нибудь работающая работа?

Я использую Grails 1.3.3

ОБНОВИТЬ: Я обновил упрощенный код. И теперь я знаю, что ограничение «размер» не может использоваться с «пустым», но все еще не работает.

Мой тестовый класс в тест/блок/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 возвращаются ложно с теплым ('hihi', 3)). У кого -нибудь есть подсказка?

Обновление 3: Я следил за Виктором Уэй, и теперь проблема решается, если я звоню Validate () до Haserrors (). Но я до сих пор не понимаю, почему «Grails Generate-All» контроллеры не должны вызовать Validate () перед использованием haserrors ()?

Это было полезно?

Решение

Ты В самом деле нужно позвонить validate() До - это запустит проверку и изменит состояние объекта. Смотря на ValidationGrailsPlugin.addValidationMethods(), Я вижу, что Haserrors ()-это метод только для чтения.

Ваш образец сработал для меня после звонка Validate (). Я попробовал grails console (Отличный инструмент, я очень рекомендую его!):

Warm w = new Warm('')
w.hasErrors() // 'Result: false'
w.validate()
w.hasErrors() // 'Result: true'

я добавил @Validateable теплый класс. Я считаю, что это не имеет значения.

Другие советы

Я не думаю validate() а также hasErrors() Динамические методы добавляются в модульном тесте. Если вы перенесете это в интеграционный тест, они должны быть там.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top