Ich habe es. Und ja, es ist ein Fehler.
Das Problem ist, dass es hier zwei Ebenen von string.Format
geht.
Der erste Niveau der Formatierung ist so etwas wie:
string template = string.Format("Expected: {0}; Actual: {1}; Message: {2}",
expected, actual, message);
Dann benutzen wir string.Format
mit den Parametern, die Sie geliefert haben:
string finalMessage = string.Format(template, parameters);
(Offensichtlich gibt es Kulturen vorgesehen ist, und einige Art der Desinfektion ... aber nicht genug.)
Das sieht gut aus - es sei denn, die erwarteten und tatsächlichen Werte selbst enden mit geschweiften Klammern, nachdem sie in eine Zeichenkette konvertiert wurden - was sie für Size
tun. Zum Beispiel endet die erste Größe bis zu Umgewandelt:
string.Format("Expected: {Width=0, Height=0}; Actual: {Width=1, Height=1 }; " +
"Message = Failed expected {0} actually is {1}", struct1, struct2);
... und das ist, was andernfalls:
{Width=0, Height=0}
So ist die zweite Ebene der Formatierung etwas wie ist. Autsch.
der Tat können wir das wirklich leicht beweisen, indem sie die Formatierung täuscht unsere Parameter für die erwarteten und tatsächlichen Teile zu verwenden:
var x = "{0}";
var y = "{1}";
Assert.AreEqual<object>(x, y, "What a surprise!", "foo", "bar");
Das Ergebnis ist:
Assert.AreEqual failed. Expected:<foo>. Actual:<bar>. What a surprise!
klar gebrochen, als wir nicht erwartet foo
noch war der tatsächliche Wert bar
!
Im Grunde ist dies wie ein SQL-Injektion Angriff, aber in dem eher weniger beängstigenden Kontext von string.Format
.
Als Workaround können Sie string.Format
verwenden, wie StriplingWarrior vorschlägt. Dies vermeidet, dass die zweite Formatierungsebene für das Ergebnis der Formatierung mit den tatsächlichen/erwarteten Werten ausgeführt wird.
haben Sie versucht, 'Assert.AreEqual (struct1, struct2, string.Format (" Fehlgeschlagen erwartet {0} ist eigentlich {1} ', struct1.ToString(), struct2.ToString()))?" – DiskJunky
That funktioniert gut, aber ich bin neugierig, warum Assert.AreEqual() kann nicht eine Zeichenfolge mit Strukturtypen formatieren – Kyle
@Kyle Aus Neugier, ist dies nicht mit der Silverlight-kompatiblen Version des Unit Testing-Framework, ist es ? Ich kann es mit diesen DLLs reproduzieren (habe noch nicht die volle .NET-Framework-Version ausprobiert) EDIT: vergiss es, auch mit den vollen getestet und immernoch fehlgeschlagen. :) –