Grails save()传递虽然hasMany关系中的对象具有约束错误

时间:2013-03-22 16:54:40

标签: grails constraints has-many domain-object

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

    }
}

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

0 个答案:

没有答案