1

我按照这里的说明操作: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('Hihi', 3) 返回 false)。有人有线索吗?

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

4

2 回答 2

4

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

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

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

我加入@Validateable了温暖的班级。我相信这没有什么区别。

于 2010-12-22T13:50:03.670 回答
1

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

于 2010-12-17T18:10:58.567 回答