У меня есть два идентичных байтовых массива в следующем сегменте кода:
/// <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 завершится ошибкой?
c#
unit-testing
assert
Дэвид Андерсон
источник
источник
Assert.AreEqual
будет работать нормально.Ответы:
Assert.Equals
тесты с использованиемEquals
метода, который по умолчанию использует ссылочное равенство и, поскольку это разные объекты, они не равны. Вы захотите сравнить каждый байт в массиве и убедиться, что они равны. Один из способов сделать это - преобразовать их во что-то, что реализует ICollection, и вместо этого использовать CollectionAssert.AreEqual () .источник
ICollection
Конечно, массив уже есть . Это даже файлIList
. Важно, чтобы ваше «равенство коллекций» учитывало порядок (т.е. коллекции должны быть равны как последовательности, а не только как математические множества).Потому что массивы не отменяют
Equals
.Вы не сказали, какую платформу тестирования вы используете, но в основном это будет зависеть от этой структуры для специальных массивов. Конечно, вы всегда можете реализовать свой собственный вспомогательный метод. Иногда я так поступал. Для быстрого и грязного взлома, если вы используете .NET 3.5, вы можете использовать
Enumerable.SequenceEqual
метод расширения:Разумеется, специальный вспомогательный метод может дать вам более подробную информацию о том, чем они отличаются. Вы можете найти методы
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 под капотом в конечном итоге по умолчанию будет использовать Object.Equals () для ненулевых значений. Реализация Object.Equals () по умолчанию - ссылочное равенство. Два массива имеют одинаковое значение, но различаются по ссылкам и, следовательно, не будут считаться равными.
источник
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]); } }
источник