2012-04-20 12 views
8

estoy tratando de comparar dos listas usandoCollectionAssert.AreEqual Failing

CollectionAssert.AreEqual(ListExpected, ListActual); 

Pero estoy consiguiendo una excepción

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> 

Pero cuando comparaba el elemento cero utilizando Assert.AreEqual en campo por campo todo estaba multa.

Cualquier idea de por qué no puedo comparar el uso de CollectionAssert

+0

¿Son en realidad referencia igual? Incluso si todos los datos son iguales, puede que no sea la misma instancia. – Tejs

+3

son los elementos de las colecciones que está comparando implementando 'Equals' y' GetHashCode' correctamente? –

+0

¿Las referencias del elemento cero eran las mismas, o solo los valores de campo? – ken

Respuesta

11

Un objeto es "declarado" igual a otro objeto en .NET es decir, si su método Equals(object other) devuelve verdadero. Debe implementar ese método para su clase API.Program.Relation, de lo contrario .NET considera que sus objetos son diferentes a menos que sean de referencia igual. El hecho de que todos los campos sean iguales no importa para .NET: si necesita semántica de igualdad de campo por campo, debe proporcionar una implementación de Equals que lo admita.

Cuando anula Equals, no olvide anular también GetHashCode; deben anularse juntos.

Si no quiere o no puede anular Equals por alguna razón, se puede usar an overload of CollectionAssert.AreEqual que toma una instancia de IComparer para ayudar en la comparación de elementos de la colección.

+3

Y cuando anula Equals/GetHashCode, considere hacer que la clase sea inmutable también. –

+0

@HenkHolterman o al menos los campos que se utilizan para calcular la igualdad y el código hash – phoog

Cuestiones relacionadas