2013-05-15 1 views
1

를 사용하여 평등 객체의 테스트 컬렉션이 나는 쉽게 전화와 같은 사용하여 해당 개체의 IEnumerable 컬렉션을 비교할 수 있습니다 테스트있을 때 :내가 너무 <code>IEquatable<T></code>을 구현 만든 클래스가 IEquatable <T>

Assert.IsTrue(expected.SequenceEqual(actual)); 

이것은 현재 잘 작동하고 있지만 약간의 잔소리에 의혹이 있습니다. 클래스는 다음과 같습니다 다음 GetHashCode()를 오버라이드 (override)의

public class ThirdPartyClaim : IEquatable<ThirdPartyClaim> 
{ 
    // fields removed for question 

    public bool Equals(ThirdPartyClaim compareTo) 
    { 
     if (object.ReferenceEquals(this, compareTo)) 
     { 
      return true; 
     } 

     return this.ClaimId.Equals(compareTo.ClaimId) && 
       this.Firstname.Equals(compareTo.Firstname) && 
       this.Lastname.Equals(compareTo.Lastname); 
    } 

    public override int GetHashCode() 
    {  
     int hashClaimId = this.ClaimId == null ? 0 : this.ClaimId.GetHashCode(); 
     int hashFirstname = this.Firstname == null ? 0 : this.Firstname.GetHashCode(); 
     int hashLastname = this.Lastname == null ? 0 : this.Lastname.GetHashCode(); 

     return hashClaimId^hashFirstname^hashLastname; 
    } 

나의 이해는 클래스의 동일한 인스턴스를 가리키는 객체를 비교하는 데 사용된다는 점이다. 이 경우에 (심지어 미래에도) 이것이 요구되지는 않을 것입니다.

이 이해가 정확합니까? 그렇다면 안전하게 코드를 제거 할 수 있습니까?

단위 테스트에서 이러한 개체의 컬렉션을 비교하는 더 좋은 방법이 있습니까?

비록 MSTest를 사용하는 데 제약이 있습니다. 당신이 Equals 무시 그렇지 않으면 해시 기반 컨테이너가 제대로 작동하지 않을 때 GetHashCode 재정

Thans은

+1

아니요, GetHashCode()는 모든 인스턴스의 해시 코드를 계산하는 데 사용됩니다. 'Equals'의 구현에 사용 된 필드는 해시 코드를 계산할 때도 사용해야합니다. –

답변

4

필요합니다. Object.Equals의 설명서에서 :

Equals를 재정의하는 형식도 GetHashCode를 재정의해야합니다. 그렇지 않으면 Hashtable이 올바르게 작동하지 않을 수 있습니다.

코드가 귀하의 케이스에서 행사되지 않을 수도 있지만 어쨌든 보관해야합니다. 현재 첫 번째와 마지막 이름의 주위에 전환 : 나는 GetHashCode 구현 만들 것

Assert.IsTrue(expected.Except(actual).Count() == 0);  

하나의 변화는 대칭을 제거한다 : 올바른 일뿐만 아니라, 당신이 상관없이 순서 컬렉션의 평등을 테스트 도움이 될 것이다 객체 내부에서 동일한 해시 코드가 생성됩니다. 이것은 차선책입니다. 해시 코드를 작은 소수 (예 : 0)로 곱하여 여러 개의 int을 결합 할 수 있습니다. 31, 그리고 이것을 다음과 같이 덧붙입니다.

public override int GetHashCode() 
{  
    int hashClaimId = this.ClaimId == null ? 0 : this.ClaimId.GetHashCode(); 
    int hashFirstname = this.Firstname == null ? 0 : this.Firstname.GetHashCode(); 
    int hashLastname = this.Lastname == null ? 0 : this.Lastname.GetHashCode(); 

    return 31*31*hashClaimId + 31*hashFirstname^hashLastname; 
}