2010-01-13 2 views
4

두 개의 콜렉션이 동일한 지 확인하고 싶은 테스트 시나리오가 있습니다. Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert 클래스를 찾았지만 ICollection<T>에서만 작동합니다. Entity Framework 저장소를 테스트 중이므로 IObjectSet<T>을 비교해야합니다. 즉, IObjectSet<T>ICollection<T>을 구현하지 않습니다.IEnumerable <T>에 Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert를 사용할 수 있습니까?

이 클래스를 사용하여 collecitons를 비교할 수있는 방법이 있습니까? 아니면 직접 구현을 만들어야합니까? (즉, 컬렉션에 대해 "기본 인터페이스"있는 그대로 그리고 도대체는 Microsoft 팀하지 않은 이유, 대신 IEnumerable<T>을 가지는 클래스를 작동하게?)

편집 :

// Arrange 
var fakeContext = new FakeObjectContext(); 
var dummies = fakeContext.Dummies; 
var repo = new EFRepository<DummyEntity>(fakeContext); 

// Act 
var result = repo.GetAll(); 

// Assert 
Assert.IsNotNull(result, NullErrorMessage(MethodName("GetAll"))); 
Assert.IsInstanceOfType(result, typeof(IEnumerable<DummyEntity>), IncorrectTypeMessage(MethodName("GetAll"), typeof(IEnumerable<DummyEntity>))); 
CollectionAssert.AreEqual(dummies.ToList(), result.ToList()); 
:
이 내 테스트 코드입니다

마지막 줄에서 CollectionAssert.AreEqual 호출이 실패하여 인덱스 0의 요소가 동일하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

3

건방진 옵션 (별로 정보는 아니지만)은 expected.SequenceEqual(actual)true을 반환한다고 주장하는 것입니다.

컬렉션 (각각 .ToList())을 강제 실행하는 래퍼 메서드를 작성할 수 있습니까? 그러나 솔직히 말해서 당신은뿐만 아니라 단지 단위 테스트 코드에 .ToList()를 호출 할 수 있습니다

CollectionAssert.AreEqual(expected.ToList(), actual.ToList()); // but tidier... 
+0

'.ToList()'가 모든 콜렉션을 호출하면 코드가 컴파일됩니다. 그러나 필자는 통과 할 수있는 테스트를 작성할 수 없습니다. 게시물에 편집 코드를 제공합니다. –

+0

'DummyEntity'에'.Equals()'를 구현하는 것이 트릭을 만들었습니다. –

2

당신이 비교하는 경우 결과는 당신이 순서를 무시합니다 CollectionAssert.AreEquivalent을 사용할 수 있습니다 설정합니다. 또한 비교하는 요소 유형에 Equals를 구현했는지 확인해야합니다.

+0

사실 나는이 주장이 순서를 신경 쓰고 싶지만 컬렉션에'.ToList()'를 호출하는 것과 결합하여'.Equals()'를 구현하고 싶습니다. (어쨌든'CollectionAssert.AreEquivalent'를 사용하기 위해해야 ​​할 것입니다. 그래서 그는 그가 당신에게가 아니라 대표를 얻었습니다) 트릭을했습니다. 감사! –

관련 문제