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é fallaría Assert.AreEqual?
c#
unit-testing
assert
David Anderson
fuente
fuente
Assert.AreEqual
lo que funcionará bien.Respuestas:
Assert.Equals
pruebas usando elEquals
método, que por defecto usa igualdad de referencia y, al ser objetos diferentes, no son iguales. Querrá comparar cada byte en la matriz y verificar que sean iguales. Una forma de hacer esto es convertirlos en algo que implemente ICollection y usar CollectionAssert.AreEqual () en su lugar.fuente
ICollection
, por supuesto. Incluso es unIList
. Es importante que su "igualdad de colección" considere el orden (es decir, las colecciones deben ser iguales como secuencias, no solo como conjuntos matemáticos).Porque las matrices no anulan
Equals
.No ha dicho qué marco de prueba está usando, pero básicamente dependerá de ese marco para matrices de casos especiales. Siempre puede implementar su propio método de ayuda para hacer eso, por supuesto. A veces he hecho eso. Para un truco rápido y sucio, si está usando .NET 3.5, puede usar el
Enumerable.SequenceEqual
método de extensión:Por supuesto, un método de ayuda personalizado podría brindarle más detalles sobre cómo se diferencian. Es posible que encuentre los métodos
MoreLINQ.TestExtensions
útiles, aunque también son bastante toscos y están listos.fuente
//Initialize your arrays here byte[] array1 = new byte[0]; byte[] array2 = new byte[0]; Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));
fuente
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 a valor, pero en referencia a diferencias y, por lo tanto, no se considerarán iguales.
fuente
byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );
compararé las cosas ... Funciona para mí ..
fuente
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]); } }
fuente