2016-08-29 2 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} 메소드를 사용할 수 없기 때문에 오류가 발생합니다. 이것은 내가 사용하는 믹스 인에 관계없이 일어나는 것처럼 보입니다 ... 나는 그것을 올바르게 설정하지 않았기 때문에 Hibernate 믹스 인을 다시 시도 할 예정입니다. testFor (서비스)에 관한 원래 게시에 대한 내 추가 의견을 참조하십시오. –

관련 문제