在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){
}
}
在应用程序代码中测试和做出反应的正确方法是什么?