【问题标题】:Grails - testing custom validator on domain class issueGrails - 在域类问题上测试自定义验证器
【发布时间】:2010-08-19 20:56:15
【问题描述】:

我正在从 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: []

我被困住了,没有找到任何解决方案:/ 任何帮助将不胜感激。

【问题讨论】:

  • 您提到您使用的是 Jason Rudolph 的书,所以我假设您使用的是第一版。这是非常过时的,您应该使用免费的第二版:infoq.com/minibooks/grails-getting-started
  • 是的,事实证明我使用的是旧版本 - 我知道有第二版,但我忘了下载它:P

标签: grails grails-validation


【解决方案1】:

您缺少 mockForConstraintsTests() 调用。常见的模式是在 setUp() 中执行此操作

protected void setUp() {
  super.setUp()
  mockForConstraintsTests(Race)    
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为基本原理是模拟不提供与真实数据库相同的行为。缺点是单元测试比集成测试运行得快得多。对于 TDD 集成测试恕我直言太慢了。所以我会在这里坚持单元测试。
    • @Burt Beckwith,您能否在您的陈述背后提供一些推理,即不应使用单元测试/模拟来测试域类?这是一个令人不安的声明,因为我有很多测试就是这样做的。更令人不安(正如您所指出的)是 Grails 自动为域类创建单元测试。此外,Grails in Action 第 7.2.1 章特别提到要使用单元测试来测试域类约束。如果我们真的不应该使用单元测试来测试领域类,我希望这些事情早日得到解决,以防止不必要的混乱。
    • 使用单元测试测试约束是可以的,尽管仅使用模拟测试内存中的唯一约束是不现实的,因为它实际上是由数据库功能支持的。请记住,单元测试中的内存中“数据库”不是 H2,当然也不是您在 dev 或 prod 中使用的数据库,它是 ConcurrentHashMap。使用 mocking 测试持久性时出现误报的风险非常高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2020-05-10
    相关资源
    最近更新 更多