在 hasMany 关系下处理域类上的域保存错误的正确方法是什么?即使在拥有的对象上存在验证错误,在关系的拥有方调用 save() 似乎也会返回 true。
我应该如何在运行代码或集成测试中对此进行测试?
我已将我的问题简化为以下简单案例。
class User {
static hasMany = [emails: Email]
static constraints = { }
}
.
class Email {
static belongsTo = [user: User]
String emailAddress
static constraints = {
emailAddress unique: true
}
}
这里有两个关于如何做到这一点的建议。两者都不是很优雅。
第一个在 hasMany 关系上分别调用 save() 。这里的好处是我们从测试用例中得到了确切的错误。这相当麻烦。
@Test
void testHasManyConstraintsOwned(){
def john = new User(login: 'johnDoe')
def email = new Email(emailAddress: 'john@gmail.com')
def duplicateEmail = new Email(emailAddress: 'john@gmail.com')
john.save() // otherwise: NULL not allowed for column "USER_ID" is thrown for email.save()
john.addToEmails(email).addToEmails(duplicateEmail)
assert email.save()
assert !duplicateEmail.save()
assert "unique"== duplicateEmail.errors.getFieldError("emailAddress").code
}
另一种方法使用 try/catch 来检测异常失败。这里的问题是我们无法知道出了什么问题,因此无法实际测试域约束是否按预期工作。
@Test
void testHasManyConstraintsOwningExcp(){
def john = new User(login: 'johnDoe')
def email = new Email(emailAddress: 'john@gmail.com')
def duplicateEmail = new Email(emailAddress: 'john@gmail.com')
john.addToEmails(email).addToEmails(duplicateEmail)
try {
john.save(flush: true, failOnError: true)
assert false // should not reach here
}catch(Exception e){
}
}
在应用程序代码中测试和反应的正确方法是什么?