test example equal assertequals areequal are c# unit-testing object compare xunit

c# - example - Comparando dos objetos usando Assert.AreEqual()



assertequals c# example (5)

Assert.AreEqual () compara referencias. Por lo general, al comparar listas, comparo el recuento de los elementos y algunas propiedades de un elemento exacto en la lista o directamente el elemento en la lista (pero nuevamente es la referencia).

Si desea comparar objetos por contenido, entonces tendría que implementar un Comparador de Objetos recursivo, pero no creo que sea apropiado para Pruebas Unitarias, porque desea que se ejecuten siempre lo más rápido posible.

Estoy escribiendo casos de prueba por primera vez en Visual Studio. C # Tengo un método que devuelve una lista de objetos y quiero compararlo con otra lista de objetos utilizando el método Assert.AreEqual() .

Intenté hacer esto, pero la afirmación falla incluso si los dos objetos son idénticos.

Quería saber si este método, los dos parámetros están comparando referencias o el contenido del objeto,

¿Tengo que sobrecargar el operador == para hacer que esto funcione?


Assert.AreEqual en xUnit en .NET comprobará si los objetos son idénticos, sin embargo la identidad del objeto es diferente de la igualdad de valores, parece que está buscando la igualdad de valores. Es decir. "¿Los objetos en mi lista tienen el mismo valor?" por lo que "falla", las dos listas no son idénticas, aunque los valores de cada objeto en cada lista pueden representar el mismo valor.

Por lo general, en un esfuerzo de prueba debería ser suficiente para probar el conteo de una colección y los elementos clave.

var count = listA.Count; Assert.AreEqual(count,listB.Count); Assert.AreEqual(listA.First(),listB.first()); Assert.AreEqual(listA.Last(),listB.Last()); Assert.AreEqual(listA[count/2],listB[count/2]);

La última prueba no tiene que estar en el elemento central y simplemente pretende probar un elemento en la lista, la única razón por la que no es un elemento aleatorio es porque desearía poder reproducir los resultados de sus pruebas.


Estas respuestas son demasiado complicadas para el problema. No hay anulaciones necesarias para comparar dos listas, y no es necesario desglosar múltiples afirmaciones. Microsoft usa la siguiente clase, CollectionAssert.

CollectionAssert.AreEqual(expectedList, actualList)

Esto funciona para listas, diccionarios y cualquier otra cosa que implemente la interfaz de ICollection.

La documentación de Microsoft se encuentra en la siguiente ubicación y detalla los distintos tipos de afirmaciones que se pueden hacer en las colecciones.

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx

Sin embargo, como lo mencionó @Bart, esto no funciona como se esperaba en las Listas de objetos (complejos), y es posible que el método Equals aún deba sobrescribirse en esos casos.


Podrías serializarlos y probar la cadena resultante.


Si está utilizando NUnit esto es lo que dice la documentación

A partir de la versión 2.2, también se incluyen disposiciones especiales para comparar matrices de una sola dimensión. Dos matrices serán tratadas como iguales por Assert.AreEqual si tienen la misma longitud y cada uno de los elementos correspondientes es igual. Nota: las matrices multidimensionales, las matrices anidadas (matrices de matrices) y otros tipos de colección como ArrayList no son compatibles actualmente.

En general, si está comparando dos objetos y desea tener una igualdad basada en valores, debe anular el método Equals .

Para lograr lo que buscas, prueba algo como esto:

class Person { public string Firstname {get; set;} public string Lastname {get; set;} public override bool Equals(object other) { var toCompareWith = other as Person; if (toCompareWith == null) return false; return this.Firstname == toCompareWith.Firstname && this.Lastname == toCompareWith.Lastname; } }

y en tu prueba de unidad:

Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());