visual unit test studio make how examples ejemplos ejemplo c# unit-testing assert

make - unit test c# visual studio 2017



¿Por qué Assert.AreEqual(T obj1, Tobj2) falla con matrices de bytes idénticas (6)

Tengo dos matrices de bytes idénticas en el siguiente segmento de código:

/// <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); }

Ambas matrices son idénticas hasta el mismo byte. En este escenario, ¿por qué faltaría Assert.AreEqual?


El método Assert.AreEqual bajo el capó terminará por defecto en Object.Equals () para valores no nulos. La implementación predeterminada de Object.Equals () es la igualdad referencial. Las 2 matrices son idénticas en cuanto al valor, pero la referencia de referencia es sabia y, por lo tanto, no se considerarán iguales.


Método de ayuda simple creado:

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]); } }


Porque las matrices no anulan Equals .

No ha dicho qué marco de prueba está utilizando, pero básicamente correspondería a ese marco las matrices de casos especiales. Siempre puedes implementar tu propio método de ayuda para hacer eso, por supuesto. Lo he hecho a veces Para un truco rápido y sucio, si está usando .NET 3.5, puede usar el método de extensión Enumerable.SequenceEqual :

Assert.IsTrue(actual.SequenceEqual(expected));

Un método de ayuda personalizado podría darle más detalles sobre cómo difieren, por supuesto. Puede encontrar los métodos en MoreLINQ.TestExtensions útiles, aunque son bastante difíciles y están listos también.


Pruebas de Assert.Equals usando el método Equals , que usa por defecto la igualdad de referencia y, dado que son objetos diferentes, no son iguales. Querrá comparar cada byte en la matriz y verificar que sean iguales. Una forma de hacerlo es convertirlos a algo que implemente ICollection y use CollectionAssert.AreEqual() lugar.


//Initialize your arrays here byte[] array1 = new byte[0]; byte[] array2 = new byte[0]; Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));


byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );

compararé las cosas ... Funciona para mí ...