Saya memiliki dua array byte identik di segmen kode berikut:
/// <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);
}
Kedua larik identik hingga satu byte. Dalam skenario ini, mengapa Assert.AreEqual gagal?
c#
unit-testing
assert
David Anderson
sumber
sumber
Assert.AreEqual
akan berfungsi dengan baik.Jawaban:
Assert.Equals
tes menggunakanEquals
metode, yang secara default menggunakan persamaan referensi dan, karena mereka adalah objek yang berbeda, mereka tidak sama. Anda akan ingin membandingkan setiap byte dalam larik dan memverifikasi bahwa keduanya sama. Salah satu cara untuk melakukannya adalah mengonversinya menjadi sesuatu yang mengimplementasikan ICollection dan sebagai gantinya gunakan CollectionAssert.AreEqual () .sumber
ICollection
tentu saja sudah menjadi sebuah . Ini bahkanIList
. Penting bahwa "persamaan koleksi" Anda mempertimbangkan pengurutan (yaitu, koleksi harus sama dengan urutan, tidak hanya sebagai kumpulan matematika).Karena array tidak menimpa
Equals
.Anda belum mengatakan kerangka pengujian mana yang Anda gunakan, tetapi pada dasarnya itu akan tergantung pada kerangka kerja itu untuk array kasus khusus. Anda selalu bisa mengimplementasikan metode helper Anda sendiri untuk melakukan itu, tentu saja. Saya terkadang melakukannya. Untuk peretasan cepat dan kotor, jika Anda menggunakan .NET 3.5 Anda dapat menggunakan
Enumerable.SequenceEqual
metode ekstensi:Metode pembantu khusus tentu saja dapat memberi Anda lebih banyak detail tentang perbedaannya. Anda mungkin menemukan metode ini
MoreLINQ.TestExtensions
bermanfaat, meskipun cukup kasar dan siap juga.sumber
//Initialize your arrays here byte[] array1 = new byte[0]; byte[] array2 = new byte[0]; Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));
sumber
Metode Assert.AreEqual di bawah tenda akan menjadi default ke Object.Equals () untuk nilai non-null. Implementasi default Object.Equals () adalah persamaan referensial. 2 array adalah nilai yang identik bijaksana tetapi referensi perbedaan bijaksana dan karenanya tidak akan dianggap sama.
sumber
byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );
akan membandingkan hal-hal ... Berhasil untuk saya ..
sumber
Membuat metode pembantu sederhana:
private static void CompareArrays<T>(T[] expected, T[] actual) { Assert.AreEqual(expected == null, actual == null, "Expected {0}null value and {1}null found.", expected == null ? "" : "not", actual == null ? "" : "not"); if (expected == null || actual == null) return; Assert.AreEqual(expected.LongLength, actual.LongLength, "Expected Length is {0} actual: {1}", expected.LongLength, actual.LongLength); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], "Values on index {0} are not equal. Expected {1} actual: {2}", i, expected[i], actual[i]); } }
sumber