2012-06-21 5 views
5

XUnit 프레임 워크를 사용하여 C# 코드를 테스트하고 있습니다.XUnit 객체의 평등을 검사하기위한 어설 션

이 프레임 워크에서 객체 비교를 수행 할 수있는 어설 션 방법이 있습니까? 내 의도는 각 개체의 공개 및 전용 멤버 변수가 동일한 지 확인하는 것입니다.

나는 그 대안을 시도했지만 거의가 작동하지 않습니다 : 당신이 그렇지 않으면 그들이 같은 언급 여부를 기준으로 확인 된 개체를 비교할 때

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

xUnit에는 "심층 비교"가 있습니다. 개체에 IEquatable 을 구현해야하며 Assert.Equals가 작동합니다. – seldary

+1

'Assert.Same()'은 참조로 비교됩니다. 그것은 Obj1과 Obj2가 ** 같은 **보기 **보다는 ** 같은 ** 객체임을 주장한다. – TeaDrivenDev

답변

6

당신은이를 달성하기 위해 사용자 정의 비교자를 가질 필요 메모리에있는 객체. 당신이 EqualsGetHashCode 방법을 재정의해야하고 당신이 할 수있는이 동작을 재정의하려면 또한 http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

경향이 질문에 코멘트 :

여기
Assert.True(obj1.Equals(obj2)); 

는 MSDN 페이지 ABT 오버로드 것은 방법 같음 What's the difference between IEquatable and just overriding Object.Equals()?

+1

사용자 정의 "같음"메소드를 구현하면이 점검을 수행 할 수 있음을 이해합니다. 그러나 블라인드 바이트 비교를 수행하는 방법이 있습니까? 그러면 쉽게 확인할 수 있습니다. 이것은 내가 단위 테스트를 위해서 "테스트중인 소프트웨어"에서 "Equals"구현을 끝내기 때문입니다. – inquisitive

+1

두 객체를 바이트 배열로 변환하기 위해 직렬화 메서드를 사용하여 시도해 보았습니다. 그러나 private 멤버 변수가있는 클래스에 [serializable] 특성을 추가하는 제약이 따릅니다. 나는 이것이 디자인 관점에서 좋지 않다는 것을 짐작한다 – inquisitive

8
나는 유사한 문제가 있었다

,하지만 다행히도 이미 사용하고

using Newtonsoft.Json; 

그래서 json 객체에 직렬화하고 문자열로 비교해야했습니다.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

나는 나의 주장이 실패했기 때문에 무엇이 잘못되었는지 말해 줄 수 있기 때문에 Equals 메서드를 구현하는 것보다 더 유용하다고 생각한다. 내가 이상적으로 바라는 것은 객체 트리를 가로 질러 어떤 속성/하위 트리가 동일하지 않고 그 정보로 실패하는지에 대한 정보를 축적하는 것입니다. –

+0

@RikkiGibson이이를 구현하는 데 올바른 방법으로 구현되지 않습니다. 그냥 다른 모든 속성에 대한 equals의 목록에 예외를 추가 한 다음 끝에 true를 반환하거나 모든 예외를 throw합니다. –

+0

예,하지만 그럴 필요가있는 이유는 사례별로 처리하는 것입니다. 일반 오래된 객체, 프리미티브 및 컬렉션의 트리를 비교할 때 과거에 반영 기반 솔루션을 찾습니다. –