2012-04-20 9 views
8

Próbuję porównać dwie listy używającCollectionAssert.AreEqual upadających

CollectionAssert.AreEqual(ListExpected, ListActual); 

Ale jestem coraz wyjątek

Expected and actual are both <System.Collections.Generic.List`1[API.Program.Relation]> with 11 elements 
    Values differ at index [0] 
    Expected: <API.Program.Relation> 
    But was: <API.Program.Relation> 

Ale kiedy porównaniu element zerowy korzystając Assert.AreEqual na pole po polu wszystko było w porządku.

Każdy pomysł, dlaczego nie mogę porównać z użyciem CollectionAssert

+0

Czy w rzeczywistości są one równe? Nawet jeśli wszystkie dane są takie same, może to nie być to samo wystąpienie. – Tejs

+3

są pozycje w kolekcjach, które porównujesz poprawnie implementując 'Equals' i' GetHashCode'? –

+0

Czy odniesienia pozycji zero były takie same, czy tylko wartości pól? – ken

Odpowiedz

11

Obiekt jest „uznany” równe do innego obiektu w .NET jest, jeśli jego metoda Equals(object other) zwraca true. Musisz zaimplementować tę metodę dla swojej klasy API.Program.Relation, w przeciwnym razie .NET rozważa twoje obiekty, chyba że są one równe referencji. Fakt, że wszystkie pola są takie same, nie ma znaczenia dla .NET: jeśli potrzebujesz semantycznej równości field-by-field, musisz dostarczyć implementację Equals, która ją obsługuje.

Jeśli zastąpisz Equals, nie zapomnij również zastąpić GetHashCode - muszą one zostać zastąpione razem.

Jeśli nie chcą lub nie mogą przesłonić Equals z jakiegoś powodu, można użyć an overload of CollectionAssert.AreEqual że trwa wystąpienie IComparer pomóc w porównywaniu elementów kolekcji.

+3

A kiedy nadpisujesz Equals/GetHashCode, rozważ także uczynienie klasy niezmienną. –

+0

@HenkHolterman lub przynajmniej te pola, które są używane do obliczania równości i kodu skrótu – phoog

Powiązane problemy