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
    }
}

これを行う方法に関する 2 つの提案を次に示します。どちらも本当にエレガントではありません。

最初の 1 つは、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