2011-04-05 95 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