2016-08-29 20 views
0

Grails 2で動作する一連の単体テストをGrails 3にアップグレードし、GORM動的メソッドを使用するドメインテスト、特にaddTo {myHasMany}メソッドに問題があります。次のドメインを考えるGrails 3ユニットテストでGORM addToメソッドを使用する

は、その後、次のテストケースが接触addEmail()メソッドで参照欠落addToEmails()メソッドから生成された例外のGrails 3に失敗している

class Contact { 
    static hasMany = [ emails: ContactEmail ] 

    void addEmail(ContactEmail newEmail) { 

    //Clear the existing primary flag if the new email is marked primary 
    if (newEmail.primaryEmail == true) { 
     for (ContactEmail contactEmail in this.emails) { 
      if (contactEmail.primaryEmail == true) { 
       contactEmail.primaryEmail = false 
      } 
     } 
    } 

    //Implicitly set the primary flag on the new email if it is the first in the list 
    if ((this.emails == null) || (this.emails.size() == 0)) { 
     newEmail.primaryEmail = true 
    } 

    //Add the email to the contact 
    this.addToEmails(newEmail) 
    } 

} 

class ContactEmail { 
    String email 
    Boolean primaryEmail 

    static belongsTo = [ contact: Contact ] 
} 

オブジェクト。

@TestMixin(DomainClassUnitTestMixin) 
@TestFor(Contact) 
class ContactSpec { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    @Unroll 
    void "test Contact addEmail()"() { 
    when: 
    Contact contact = new Contact() 
    ContactEmail contactEmail = new ContactEmail(email: "[email protected]", primaryEmail: false) 
    contact.addEmail(contactEmail) 

    then:  
    /* DOC - The add email without any other emails should implicitly set the primary email */ 
    contact.primaryEmail.toString() == "[email protected]" 
    } 
} 

は私が試みているもの:

  1. 私が発生GORMメソッド(またはサブセット)とのインスタンスを生成するDomainClassUnitTestMixinとmockDomain()メソッドを使用して連絡先インスタンスをモック試みました。

  2. 私はSpock Interaction Based Testingサポートを使用してメソッドをスタブしようとしました。

実際、私はこれを運がうまくいかないようにするために考えているすべての組み合わせを試しました。最新のGrails仕様のテストセクションを読み返しました。

ここに進む方法はありますか?ユニットテストを続ける方法はありますか?

+0

私は、コンタクトドメインオブジェクトの "newEmail"のタイプを修正するコードを編集しました。 –

+0

その後、私はドメインコードとサービスで実行するテストの両方を再構成し、すべてが期待通りに機能します。この問題はドメインテストでは完全にドメインオブジェクトに限定されているようです。私はそれらを頻繁にやっていないし、この論理がとにかくサービスにあるべきだという主張がある。ドメインにこれ​​を持たせるために、「鶏と卵」の緑茶があります。 –

答えて

-1

newEmailはメソッドのどこにでも初期化されていません。したがって、null引数が渡されているため、addToEmails()が失敗します。私はあなたのメソッドの宣言を次のようにしたいと思います。

void addEmail(ContactEmail newEmail) { 
//Clear the existing primary flag if the new email is marked primary 
if (newEmail.primaryEmail == true) { 
    for (ContactEmail contactEmail in this.emails) { 
     if (contactEmail.primaryEmail == true) { 
      contactEmail.primaryEmail = false 
     } 
    } 
} 

//Implicitly set the primary flag on the new email if it is the first in the list 
if ((this.emails == null) || (this.emails.size() == 0)) { 
    newEmail.primaryEmail = true 
} 

//Add the email to the contact 
this.addToEmails(newEmail) 
} 
+0

私は誤植を修正するために元の投稿を編集しました。しかし、これは問題ではありません。質問のコード例では、単にタイプミスです。動的に挿入されたaddTo {blah}メソッドがドメインテストで使用できないため、エラーが発生します。これは、私が使用しているmixinに関係なく起こるようです...私は正しく設定していないかもしれないので、私は再びHibernateのmixinを試してみる予定です。 testFor(サービス)に関する最初の投稿に関する私のコメントを参照してください。 –

関連する問題