2013-06-20 5 views
4

필자가 작성한 일부 .net 코드에 대한 단위 테스트를 작성하고 있습니다.Assert.AreEqual은 .net 단위 테스트의 두 객체를 어떻게 비교합니까?

는이 같은 코드를 작성에 익숙 해요 :

인수가 정수 경우
int expected = 10; 
int actual = multiplyByTwo(5); 
Assert.AreEqual(expected, actual); 

, 그것은 코드가 어떻게 무엇을 기대 분명하다.

전달 된 인수가 객체 일 때 코드가 수행하는 작업은 무엇입니까?

MyClass이라는 사용자 정의 클래스를 작성한 경우 MyClass 유형의 객체로 Assert.AreEqual이 통과하고 실패 할 때 어떻게 제어 할 수 있습니까?

답변

4

official documentation은 매우 눈이 깜박이며 설명하지 않으므로 개체가 프리미티브가 아닌 경우 참조가 비교됩니다.

즉, 동일한 개체에 대한 두 개의 참조가 동일하다고 평가할 수 있습니다. 동일한 객체의 두 클론이 다른 것으로 평가됩니다. 해당 객체가 속하는 클래스의 Equals() 인스턴스 메소드를 오버로드하거나 또는 해당 클래스의 연산자 ==을 오버로드하지 않는 한.

Reed Copsey의 답변도 참조하십시오.

+1

을 클래스 Cat의 비교 인스턴스를 보여줍니다. –

3

전달 된 인수가 객체 일 때 코드가 수행하는 작업은 무엇입니까?

이 경우에는 그렇지 않습니다. 전화가 Assert.AreEqual<int>(expected, actual);입니다.

Assert.AreEqual 방법은 many overloads입니다. 이 경우 두 Int32 값에 가장 잘 맞는 값은 generic overload입니다. 이것이 "최상의 일치"이기 때문에 컴파일러는이 오버로드를 선택합니다.

이것은 내부적으로 정수로 작동 :

지정된 두 일반 타입의 데이터가 동등 연산자를 사용하여 동일한 것을 검증.

내가 MyClass에라는 분류 정의를 작성한 경우

, 어떻게 내가 Assert.AreEqual이 통과 할 때 제어 타입 MyClass에의 객체에 실패 할 수 있습니다 질문의 두 번째 부분에 관해서는

?

Assert.AreEqual은 위에 정의 된대로 equality operator (==)을 사용하여 테스트합니다.

0

개체가 serialize 할 수 있으면 개체를 serialize하고 serialize 된 버전을 비교할 수 있습니다.

XmlSerialize 확장 메서드를 사용하여 serialization을 처리 할 수 ​​있습니다.예를 들어

, 다음과 같은 사이비 코드 과부하`Equals` 나를 위해 속임수를 썼는지 것 같습니다이

var expected = GetExpectedInstance(); // returns the expected result 
var actual = CallMethodUnderTest(); // get the actual result 

var e = expected.XmlSerialize<Cat>(); 
var a = actual.XmlSerialize<Cat>(); 

Assert.AreEqual(e, a);