Ich versuche, die Gleichheit zweier System.Drawing.Size
Strukturen zu bestätigen, und erhalte eine Formatausnahme anstelle des erwarteten Bestätigungsfehlers.
[TestMethod]
public void AssertStructs()
{
var struct1 = new Size(0, 0);
var struct2 = new Size(1, 1);
//This throws a format exception, "System.FormatException: Input string was not in a correct format."
Assert.AreEqual(struct1, struct2, "Failed. Expected {0}, actually it is {1}", struct1, struct2);
//This assert fails properly, "Failed. Expected {Width=0, Height=0}, actually it is {Width=1, Height=1}".
Assert.AreEqual(struct1, struct2, "Failed. Expected " + struct1 + ", actually it is " + struct2);
}
Ist das beabsichtigtes Verhalten? Mache ich hier etwas falsch?
Assert.AreEqual(struct1, struct2, string.Format("Failed expected {0} actually is {1}
, struct1.ToString (), struct2.ToString ())) `?Antworten:
Ich habe es. Und ja, es ist ein Fehler.
Das Problem ist, dass es hier zwei Ebenen gibt
string.Format
.Die erste Formatierungsstufe ist wie folgt:
Dann verwenden wir
string.Format
mit den von Ihnen angegebenen Parametern:(Offensichtlich werden Kulturen bereitgestellt und eine Art Desinfektion ... aber nicht genug.)
Das sieht gut aus - es sei denn, die erwarteten und tatsächlichen Werte selbst stehen nach der Konvertierung in eine Zeichenfolge in geschweiften Klammern - wofür sie dies tun
Size
. Zum Beispiel wird Ihre erste Größe konvertiert in:Die zweite Formatierungsstufe ist also ungefähr so:
... und genau das scheitert. Autsch.
In der Tat können wir dies wirklich leicht beweisen, indem wir die Formatierung täuschen, um unsere Parameter für die erwarteten und tatsächlichen Teile zu verwenden:
Das Ergebnis ist:
Deutlich kaputt, da wir
foo
weder den tatsächlichen Wert erwartet hattenbar
!Im Grunde ist dies wie ein SQL-Injection-Angriff, aber in dem weniger beängstigenden Kontext von
string.Format
.Als Problemumgehung können Sie verwenden,
string.Format
wie von StriplingWarrior vorgeschlagen. Dadurch wird vermieden, dass die zweite Formatierungsstufe für das Ergebnis der Formatierung mit den tatsächlichen / erwarteten Werten ausgeführt wird.quelle
%*n
Äquivalent? :(Ich denke, Sie haben einen Fehler gefunden.
Dies funktioniert (löst eine Assert-Ausnahme aus):
Und das funktioniert (gibt die Nachricht aus):
Aber das funktioniert nicht (wirft a
FormatException
):Ich kann mir keinen Grund vorstellen, warum dies ein erwartetes Verhalten wäre. Ich würde einen Fehlerbericht einreichen. In der Zwischenzeit ist hier eine Problemumgehung:
quelle
Ich stimme @StriplingWarrior zu, dass dies tatsächlich ein Fehler mit der Assert.AreEqual () -Methode bei mindestens 2 Überladungen zu sein scheint. Wie StiplingWarrior bereits betont hat, schlägt Folgendes fehl:
Ich habe ein wenig experimentiert, um die Verwendung von Code etwas expliziter zu gestalten. Das Folgende funktioniert auch nicht;
Und
Das brachte mich zum Nachdenken. System.Drawing.Size ist eine Struktur. Was ist mit Objekten? Die Parameterliste gibt an , dass die Liste nach der
string
Nachricht lautetparams object[]
. Technisch gesehen , ja structs sind Objekte ... aber spezielle Arten von Objekten, dh Werttypen. Ich denke, hier liegt der Fehler. Wenn wir verwenden unser eigenes Objekt mit einer ähnlichen Verwendung und StrukturSize
, die folgenden tatsächlich tut Arbeit;quelle
class
oderstruct
, sondern ob derToString
Wert geschweifte Klammern enthält, die wie a aussehenString.Format
.Ich denke, die erste Behauptung ist falsch.
Verwenden Sie stattdessen Folgendes:
quelle