2010-08-19 76 views
1

我正在学习Grails的Grails - 杰森鲁道夫书籍入门。 我的域类看起来像这样:Grails - 在域类问题上测试自定义验证器

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: [] 

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

+0

你提到你使用的是Jason Rudolph的书,所以我假设你使用的是第一版。这是_very_的日期,你应该使用第二版,这也是免费的:http://www.infoq.com/minibooks/grails-getting-started – 2010-08-20 02:59:37

+0

是的,事实证明我使用的是旧版 - 我知道有第二版,但我忘了下载它:P – jjczopek 2010-08-20 16:47:11

回答

3

你不应该使用单元测试或嘲讽测试领域类。 Grails确实为域类创建了一个单元测试,这应该改变。将该类移动到测试/集成下的相同软件包和文件夹,并将基类更改为GroovyTestCase,然后您将拥有一个适当的测试,该测试可与内存数据库一起运行,并测试持久性,而不是模拟框架。

+0

我假设理由是嘲笑不提供与真实数据库相同的行为。缺点是单元测试比集成测试运行速度快得多。对于TDD集成测试,恕我直言,太慢了。所以我会坚持在这里进行单元测试。 – 2010-08-20 13:09:41

+0

@Burt Beckwith,你能否提供一些推理,说明单元测试/模拟不应该用于测试域类?这是一个令人不安的陈述,因为我有这么多的测试。更令人不安的是(正如你所指出的),Grails会自动为域类创建一个单元测试。另外Grails in Action章节7.2.1特别指出使用单元测试来测试域类限制。如果我们真的不应该使用单元测试来测试域类,我希望这些事情能够早晚得到修复,以避免不必要的混淆。 – ubiquibacon 2013-08-20 22:41:12

+0

[Grails in Action chapter 7](http://www.manning.com/gsmith/SampleChapter7.pdf) – ubiquibacon 2013-08-20 22:42:11