0

在 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){

    }
}

在应用程序代码中测试和反应的正确方法是什么?

4

0 回答 0