Ich habe zwei identische Byte-Arrays im folgenden Codesegment:
/// <summary>
///A test for Bytes
///</summary>
[TestMethod()]
public void BytesTest() {
byte[] bytes = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketData);
TransferEventArgs target = new TransferEventArgs(bytes);
byte[] expected = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketValue);
byte[] actual;
actual = target.Bytes;
Assert.AreEqual(expected, actual);
}
Beide Arrays sind bis auf das Byte identisch. Warum sollte Assert.AreEqual in diesem Szenario fehlschlagen?
c#
unit-testing
assert
David Anderson
quelle
quelle
Assert.AreEqual
problemlos funktioniert.Antworten:
Assert.Equals
Tests mit derEquals
Methode, bei der standardmäßig die Referenzgleichheit verwendet wird. Da es sich um unterschiedliche Objekte handelt, sind sie nicht gleich. Sie möchten jedes Byte im Array vergleichen und überprüfen, ob es gleich ist. Eine Möglichkeit, dies zu tun, besteht darin, sie in etwas zu konvertieren, das ICollection implementiert, und stattdessen CollectionAssert.AreEqual () zu verwenden.quelle
ICollection
natürlich schon ein . Es ist sogar einIList
. Es ist wichtig, dass Ihre "Sammlungsgleichheit" die Reihenfolge berücksichtigt (dh Sammlungen müssen als Sequenzen gleich sein, nicht nur als mathematische Mengen).Weil Arrays nicht überschreiben
Equals
.Sie haben nicht gesagt, welches Testframework Sie verwenden, aber im Grunde liegt es an diesem Framework, Arrays für Sonderfälle zu erstellen. Natürlich können Sie dazu jederzeit Ihre eigene Hilfsmethode implementieren. Ich habe das manchmal gemacht. Wenn Sie .NET 3.5 verwenden, können Sie für einen schnellen und schmutzigen Hack die
Enumerable.SequenceEqual
Erweiterungsmethode verwenden:Eine benutzerdefinierte Hilfsmethode kann Ihnen natürlich mehr Details darüber geben, wie sie sich unterscheiden. Sie finden die Methoden möglicherweise
MoreLINQ.TestExtensions
hilfreich, obwohl sie auch ziemlich grob und bereit sind.quelle
quelle
Die Methode Assert.AreEqual unter der Haube verwendet standardmäßig Object.Equals () für Werte ungleich Null. Die Standardimplementierung von Object.Equals () ist die referenzielle Gleichheit. Die 2 Arrays sind hinsichtlich des Werts identisch, aber hinsichtlich der Differenz referenziert und werden daher nicht als gleich angesehen.
quelle
werde das Zeug vergleichen ... Es funktioniert für mich ..
quelle
Einfache Hilfsmethode erstellt:
quelle