En una prueba unitaria (en Visual Studio 2008) quiero comparar el contenido de un objeto grande (una lista de tipos personalizados, para ser precisos) con una referencia almacenada de este objeto. El objetivo es asegurarse de que cualquier refactorización posterior del código produzca el mismo contenido objeto.(Profunda) comparación de un objeto con una referencia en pruebas unitarias (C#)
Idea descartada: Una primera idea fue serializar en XML, y luego comparar las cadenas codificadas o el contenido de un archivo. Esto permitiría encontrar fácilmente cualquier diferencia. Sin embargo, dado que mis tipos no son XML serializables sin un truco, debo encontrar otra solución. Podría usar la serialización binaria, pero esto ya no será legible.
¿Existe una solución simple y elegante para esto?
EDIT: Según la propuesta de Marc Gravell hago ahora así:
using (MemoryStream stream = new MemoryStream())
{
//create actual graph using only comparable properties
List<NavigationResult> comparableActual = (from item in sparsed
select new NavigationResult
{
Direction = item.Direction,
/*...*/
VersionIndication = item.VersionIndication
}).ToList();
(new BinaryFormatter()).Serialize(stream, comparableActual);
string base64encodedActual = System.Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);//base64 encoded binary representation of this
string base64encodedReference = @"AAEAAAD....";//this reference is the expected value
Assert.AreEqual(base64encodedReference, base64encodedActual, "The comparable part of the sparsed set is not equal to the reference.");
}
En esencia lo hago seleccionar las propiedades comparables en primer lugar, a continuación, codificar el gráfico, a continuación, lo comparan con una referencia codificada de manera similar. La codificación permite la comparación profunda de una manera simple. El motivo por el que uso la codificación base64 es que puedo almacenar fácilmente la referencia en una variable de cadena.
La idea de serialización parece ser una buena para gráficos profundos. – StuartLC
La serialización no es completamente confiable. Puedes obtener falsos negativos. Ver http://stackoverflow.com/questions/2244223/is-it-reliable-to-compare-two-instances-of-a-class-by-comparing-their-serialized –