Im Namespace Microsoft.VisualStudio.TestTools.UnitTesting
gibt es die handliche statische Klasse Assert
, um die Behauptungen in Ihren Tests zu behandeln.Microsoft.VisualStudio.TestTools.UnitTesting.Assert generische Methode Überladungen Verhalten
Etwas, das mich abgehört hat, ist, dass die meisten Methoden extrem überlastet sind, und darüber hinaus haben sie eine generische Version. Ein konkretes Beispiel ist Assert.AreEqual
die 18 Überlastungen hat, darunter:
Assert.AreEqual<T>(T t1, T t2)
Was ist die Verwendung dieser generischen Methode? Ursprünglich dachte ich, dies sei eine Möglichkeit, die Methode IEquatable<T> Equals(T t)
direkt aufzurufen, aber das ist nicht der Fall. Es wird immer die nicht-generische Version object.Equals(object other)
aufgerufen. Ich habe den harten Weg herausgefunden, nachdem ich ein paar Unit-Tests programmiert habe, die dieses Verhalten erwarten (anstatt die Klassendefinition Assert
im Voraus zu prüfen, wie ich es hätte tun sollen).
Um definiert werden würde, um die generische Version von Equals
, die generische Methode musste zu nennen wie:
Assert.AreEqual<T>(T t1, T t2) where T: IEquatable<T>
Gibt es einen guten Grund, warum es nicht so gemacht wurde?
Ja, verlieren Sie die generische Methode für alle jene Typen, die nicht implementieren IEquatable<T>
, aber es ist kein großer Verlust sowieso als Gleichheit durch object.Equals(object other)
geprüft werden würde, so Assert.AreEqual(object o1, object o2)
ist schon gut genug.
Bietet die aktuelle generische Methode Vorteile, die ich nicht in Betracht ziehe, oder ist es nur so, dass niemand aufhörte, darüber nachzudenken, da es nicht so viel von einem Deal ist? Der einzige Vorteil, den ich sehe, ist die Sicherheit des Argumenttyps, aber das scheint irgendwie schlecht zu sein.
bearbeiten: Ein Fehler wurde behoben, wo ich IComparable
Bezug gehalten, als ich IEquatable
gemeint.
Sie können nicht einschränken, da jede T ohne eigene Überlastung natürlich an diese Methode als Teil der Überladungsauflösung lösen würde und erst dann der Compiler über die unerfüllte Einschränkung für jede T beklagen haben, die nicht die Schnittstelle nicht implementiert. Was Ihre falsche Annahme betrifft, haben Sie die Dokumentation der Methode überprüft, bevor Sie Ihre Teststrategie darauf aufbauen? –
AnthonyPegram: Wenn Sie es beschränken, können Sie kein T übergeben, das die Schnittstelle nicht implementiert, also wie genau würde die Überladungsauflösung in Laufzeit fehlschlagen? – InBetween
Es würde zur Kompilierzeit fehlschlagen, aber die Überladungsauflösung hätte sich bereits für die T-Überladung entschieden und * dann * die Beschränkung geprüft (und fehlgeschlagen). Constraints sind nicht Teil der Signatur. Wenn Sie diesen Ausdruck suchen, finden Sie viele Ressourcen (hier und anderswo, vor allem Eric Lipperts Blog), die Ihnen mehr Details dazu geben werden. –