Почему Assert.AreEqual(T obj1, Tobj2) терпит неудачу с одинаковыми байтовыми массивами
У меня есть два одинаковых байтовых массива в следующем сегменте кода:
/// <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);
}
Оба массива идентичны вплоть до самого байта. В этом случае, почему Assert.AreEqual терпит неудачу?
Ответы
Ответ 1
Assert.Equals
с использованием метода Equals
, который по умолчанию использует ссылочное равенство и, поскольку они являются разными объектами, они не равны. Вам нужно сравнить каждый байт в массиве и убедиться, что они равны. Один из способов сделать это - преобразовать их в нечто, что реализует ICollection, и вместо этого использовать CollectionAssert.AreEqual().
Ответ 2
Поскольку массивы не переопределяют Equals
.
Вы не сказали, какую тестовую структуру вы используете, но в основном это зависит от этой структуры для специальных массивов. Конечно, вы всегда можете реализовать свой собственный вспомогательный метод. Я иногда это делал. Для быстрого и грязного взлома, если вы используете .NET 3.5, вы можете использовать метод расширения Enumerable.SequenceEqual
:
Assert.IsTrue(actual.SequenceEqual(expected));
Пользовательский вспомогательный метод может дать вам более подробную информацию о том, как они отличаются, конечно. Вы можете найти полезные методы в MoreLINQ.TestExtensions
, хотя они довольно грубые и готовы тоже.
Ответ 3
Метод Assert.AreEqual под капотом будет по умолчанию помечен Object.Equals() для ненулевых значений. По умолчанию Object.Equals() является ссылочным равенством. 2 массива идентичны по значению, но разностные ссылки мудры и поэтому не будут считаться равными.
Ответ 4
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];
Assert.AreEqual(System.Convert.ToBase64String(array1),
System.Convert.ToBase64String(array2));
Ответ 5
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );
будет сравнивать материал... Он работает для меня..
Ответ 6
Создан простой вспомогательный метод:
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]);
}
}