In einem Komponententest (in Visual Studio 2008) möchte ich den Inhalt eines großen Objekts (eine Liste von benutzerdefinierten Typen, um genau zu sein) vergleichen mit einer gespeicherten Referenz dieses Objekts. Das Ziel besteht darin, sicherzustellen, dass spätere Refactorings des Codes den gleichen Objekt-Inhalt erzeugen.(Deep) Vergleich eines Objekts mit einer Referenz in Komponententests (C#)
Verworfene Idee: Ein erster Gedanke war, in XML zu serialisieren und dann die hardcoded Zeichenfolgen oder einen Dateiinhalt zu vergleichen. Dies würde es ermöglichen, einen Unterschied leicht zu finden. Da meine Typen jedoch nicht ohne Hacker-XML serialisierbar sind, muss ich eine andere Lösung finden. Ich könnte die binäre Serialisierung verwenden, aber dies wird nicht mehr lesbar sein.
Gibt es eine einfache und elegante Lösung?
EDIT: Laut Marc GRA Vorschlag mache ich nun wie folgt aus:
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.");
}
Im Wesentlichen ich zuerst die vergleichbare Eigenschaften zu tun wählen, dann die Grafik kodieren, vergleichen, es dann zu einem ähnlich kodierten Referenz. Codierung ermöglicht einen tiefen Vergleich auf einfache Weise. Der Grund, warum ich die Base64-Kodierung verwende, ist, dass ich den Verweis einfach in einer String-Variablen speichern kann.
Die Serialisierungsidee scheint für tiefe Graphen gut zu sein. – StuartLC
Serialisierung ist nicht vollständig zuverlässig. Sie könnten falsche Negative erhalten. Siehe http://stackoverflow.com/questions/2244223/is-it-reliable-to-compare-two-instances-of-a-class-by-comparing-their-serialized –