Grails - 在域类问题上测试自定义验证器

时间:2010-08-19 20:56:16

标签: grails grails-validation

我正在学习Grails的Grails - 由Jason Rudolph的书开始。 我的域类看起来像这样:

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 个答案:

答案 0 :(得分:5)

你错过了mockForConstraintsTests()调用。常见的模式是在setUp()

中执行此操作
protected void setUp() {
  super.setUp()
  mockForConstraintsTests(Race)    
}

详细信息:http://mrhaki.blogspot.com/2009/04/unit-testing-constraints-in-domain.html

答案 1 :(得分:3)

您不应使用单元测试或模拟来测试域类。 Grails确实为域类创建了一个单元测试,这应该改变。将类移动到test / integration下的同一个包和文件夹中,并将基类更改为GroovyTestCase,您将拥有一个与内存数据库一起运行并测试持久性的正确测试,而不是模拟框架。