Grails可验证不适用于非持久域类

时间:2010-12-15 09:45:20

标签: grails grails-validation

我按照这里的说明进行操作: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)
  }
}

但是对于“hasErrors”功能它只是不起作用(“空白假”和“大小:0..25”)。它总是返回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 时,它会运行但返回false值。 (hasErrors用Warm返回false('Hihi',3))。有没有人有线索?

更新3 :我遵循了Victor方式,现在如果我在hasErrors()之前调用validate(),问题就解决了。但是我仍然不明白为什么“grails generate-all”控制器在使用hasErrors()之前不必调用validate()?

2 个答案:

答案 0 :(得分:4)

真的之前需要调用validate() - 它会触发验证并更改对象状态。查看ValidationGrailsPlugin.addValidationMethods(),我看到hasErrors()是一个只读方法。

调用validate()后,您的示例为我工作。我试过grails console(很棒的工具,我强烈推荐它!):

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

我将@Validateable添加到Warm类。我认为这没什么区别。

答案 1 :(得分:1)

我认为单元测试中不会添加validate()hasErrors()动态方法。如果将其移至集成测试,则应该在那里。