我正在尝试用grails创建一个测试,以确保唯一的:true约束有效,这是我的类和测试文件:
package 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)
}
}
package edu.drexel.goodwin.events.domain
import grails.test。*
类UpayConfigTests扩展GrailsUnitTestCase { protected void setUp(){ 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变量都为.validate()返回true,即使我告诉他们两者都有相同的siteId ......
我觉得这与这些没有放在数据库中的事实有关,只是存储在内存中?
非常感谢所有帮助,谢谢。 -Asaf
答案 0 :(得分:5)
唯一性将在数据库级别。你永远不会保存域名,所以就upayConfigTwo而言,它是独一无二的。你需要做一个常规的模拟,然后在upayConfigOne上调用save()。
答案 1 :(得分: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