2012-04-20 2 views
8

sto cercando di confrontare due liste usandoCollectionAssert.AreEqual In difetto

CollectionAssert.AreEqual(ListExpected, ListActual); 

Ma io sono sempre un'eccezione

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> 

Ma quando ho confrontato l'elemento zero usando Assert.AreEqual sul campo per campo tutto era bene.

Qualsiasi idea del perché non posso paragonare con CollectionAssert

+0

Sono effettivamente di riferimento uguali? Anche se tutti i dati sono uguali, potrebbe non essere la stessa istanza. – Tejs

+3

sono gli elementi nelle raccolte che si stanno confrontando implementando 'Equals' e' GetHashCode' correttamente? –

+0

I riferimenti dell'oggetto zero sono uguali o solo i valori dei campi? – ken

risposta

11

Un oggetto è "dichiarato" uguale ad un altro oggetto in .NET è se il suo metodo Equals(object other) restituisce true. È necessario implementare tale metodo per la classe API.Program.Relation, altrimenti .NET considera i propri oggetti diversi a meno che non siano uguali ai riferimenti. Il fatto che tutti i campi siano gli stessi non ha importanza per .NET: se hai bisogno di semantica di uguaglianza field-by-field, devi fornire un'implementazione di Equals che la supporti.

Quando si esegue l'override di Equals, non dimenticare di sovrascrivere anche lo GetHashCode - questi devono essere sostituiti insieme.

Se non si vuole o non si può ignorare Equals per qualche motivo, è possibile utilizzare an overload of CollectionAssert.AreEqual che prende un'istanza di IComparer per assistere nel confronto tra elementi della collezione.

+3

E quando si esegue l'override di Equals/GetHashCode, considerare di rendere immutabile anche la classe. –

+0

@HenkHolterman o almeno quei campi che vengono utilizzati per calcolare l'uguaglianza e il codice hash – phoog