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