2009-04-25 4 views
5

IEnumerables에 대한 C# Equals가 참조와 같음을 확인하는 동안 이상한 것으로 나타났습니다.C# Assert.AreNotEqual 대 Equals

Assert.AreNotEqual(a, b); 

하지 않는이 테스트 동안 NUnit과

var a = (IEnumerable<string>)(new[] { "one", "two" }); 
var b = (IEnumerable<string>)(new[] { "one", "two" }); 

이 테스트

Assert.IsFalse(a.Equals(b)); 

패스에서 다음 설치,와. 아무도 이유를 설명 할 수 있습니까?

편집 : 답변 해 주셔서 감사합니다. NUnit에 대한 문서를 읽었을 때, Collection과 함께 AreEqual과 AreNotEqual이 콜렉션의 각 요소가 동일한 지 여부를 테스트하는 것과 같은 것을 말합니다. 나는 AreEqual과 AreNotEqual이 단순한 Equals를 사용하고 있다는 개념에 집착했다.

답변

9

a.Equals(b)에 대한 호출은 a와 b가 같은 개체가 아니기 때문에 false을 반환합니다 (물론 동일한 열거 형 임에도 불구하고). Equals 메서드는 재정의 (override)되지 않는 한 객체를 그 참조에 의해 자동적으로 비교합니다. 이것은이 경우에 발생합니다.

Assert.AreNotEqual은 이보다 약간 영리합니다. Equals 메서드와 달리 디버깅 목적으로 설계되었으므로 IEnumerable<T>을 특수 형식으로 인식하므로 실제로 두 열거 형에서 생성 된 시퀀스를 비교합니다. 또한 두 개의 매개 변수가 수치상으로 동일하지만 값 유형이 다른 경우 (예 : shortlong) true을 반환하는 것과 같은 다른 흥미로운 작업이 있음을 알아야합니다.

희망이 있습니다.

1

나는 NUnit 소스 코드를보고 NUnit 사람들이 AreNotEqual을 어떻게 코딩했는지 보지 않았다. 그러나 동일한 동작을하는 MbUnit에서 어떻게 완료되었는지 말할 수 있습니다.

AssertNotEqual에 우선 (a, b) 참조는 다음과 같은 코드를 실행함으로써, 동일한 체크한다 : 실패 것 귀하의 경우

if (Object.ReferenceEquals(left, right)) 
     return true; 

. 다음으로 오브젝트가 IEnumerable 유형인지 점검합니다. 일치하는 경우 항목을 반복하여 항목이 동일하고 동일한 순서로 비교되는지 비교합니다.

그러나 IEnumerable의 T 유형은 MbUnit의 문자열 또는 ValueType보다 복잡합니다. AssertNotEqaual (a, b)는 실패하지 않습니다.

var a = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") }); 
    var b = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") }); 

    Assert.IsFalse(a.Equals(b)); // Success 
    Assert.AreNotEqual(a, b);  // Success