2010-08-19 97 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