2010-01-13 42 views
4

我有一個測試場景,我想檢查兩個集合是否相等。我找到了類Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert,但它只適用於ICollection<T>。由於我正在測試Entity Framework的存儲庫,因此需要比較IObjectSet<T>,這不會執行 - IObjectSet<T>不會執行ICollection<T>是否可以在IEnumerable <T>上使用Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert?

有什麼辦法可以使用這個類來比較集合,還是我必須創建自己的實現? (爲什麼赫克沒有微軟團隊做出與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()'調用時,代碼將被編譯。但是,我無法撰寫我可以通過的測試 - 請參閱我在編輯中提供的代碼以查看我的帖子。 – 2010-01-16 13:35:35

+0

原來在'DummyEntity'上實現'.Equals()'是個竅門。 – 2010-01-16 15:14:16

2

如果你比較的結果集,你可能需要使用CollectionAssert.AreEquivalent,將忽略該命令。你還應該確保你已經在你正在比較的元素類型上實現了Equals。

+0

實際上,我確實希望斷言關心順序,但是在集合上調用'.Equals()'並結合調用'.ToList()'(無論如何我都必須這樣做來使用'CollectionAssert.AreEquivalent',這就是他得到代表而不是你)的原因。謝謝! – 2010-01-16 15:15:42

相關問題