2011-04-05 162 views
2

我想創建Grails的測試,以保證確實是獨特的:真正約束的作品,這是我的等級和測試文件:Grails獨特測試失敗?

包edu.drexel.goodwin.events.domain

類UpayConfig {

String name 
String siteId 
String postingCode 

static constraints = { 
    name(blank:false, maxSize:50) 
    siteId(blank:false, unique:true) 
    postingCode(blank:false) 
} 

}

包edu.drexel.goodwin.events.domain

進口GRAI ls.test。*

類UpayConfigTests延伸GrailsUnitTestCase { 保護無效設置(){ super.setUp() }

protected void tearDown() { 
    super.tearDown() 
} 

void testCleanUpayConfigValidates() { 
    mockForConstraintsTests UpayConfig 
    def cleanUpayConfig = create() 
    assertTrue cleanUpayConfig.validate() 
} 

void testUpayConfigSiteIdMustBeUnique() { 
    mockForConstraintsTests UpayConfig 
    def upayConfigOne = create() 
    def upayConfigTwo = create() 
    assertFalse upayConfigOne.validate() 
    assertFalse upayConfigTwo.validate() 

    upayConfigTwo.siteId = '81' 
    assertTrue upayConfigOne.validate() 
    assertTrue upayConfigTwo.validate() 
} 

UpayConfig create() { 
    def upayConfig = new UpayConfig(
        siteId: '82', 
        name: 'SMT - Workshops', 
        postingCode: '6' 
      ) 
} 

}

但是,第二測試失敗,upayConfig變量兩個都返回true。對於.validate(),即使我告訴他們都有相同的siteId ...

我有一種感覺,這與事實有關e沒有被放置在數據庫中,只是被存儲在內存中?

所有幫助非常感謝,謝謝。 -Asaf

回答

5

唯一性將在數據庫級別。你永遠不會保存域名,因此就UpayConfigTwo而言,它是獨一無二的。您需要定期進行模擬,並在upayConfigOne上實際調用save()。

1

謝謝。我擡頭一看這個網站:http://www.ibm.com/developerworks/java/library/j-grails10209/index.html,它有一個名爲「測試與mockForConstraintsTests的唯一約束()」部分,因此下面就我修改了我的測試是如下所示,正確地傳遞:

void testUpayConfigSiteIdMustBeUnique() { 
    def upayConfigOne = create() 
    mockForConstraintsTests(UpayConfig, [upayConfigOne]) 
    def upayConfigTwo = create() 
    assertFalse upayConfigTwo.validate() 
    assertEquals "unique", upayConfigTwo.errors["siteId"] 

    upayConfigTwo.siteId = '81' 
    assertTrue upayConfigTwo.validate() 
} 

感謝您幫助, -Asaf