J'ai deux tableaux d'octets identiques dans le segment de code suivant:
/// <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);
}
Les deux tableaux sont identiques jusqu'à l'octet même. Dans ce scénario, pourquoi Assert.AreEqual échouerait-il?
Assert.Equals
teste en utilisant la méthode Equals
, qui utilise par défaut l'égalité de référence et, comme il s'agit d'objets différents, ils ne sont pas égaux. Vous voudrez comparer chaque octet du tableau et vérifier qu'ils sont égaux. Une façon de le faire est de les convertir en quelque chose qui implémente ICollection et d'utiliser à la place CollectionAssert.AreEqual () .
Parce que les tableaux ne remplacent pas Equals
.
Vous n'avez pas dit quel framework de test vous utilisez, mais en gros, cela dépendrait de ce framework pour les tableaux de cas spéciaux. Bien sûr, vous pouvez toujours implémenter votre propre méthode d'assistance. Je l'ai fait parfois. Pour un hack rapide et sale, si vous utilisez .NET 3.5, vous pouvez utiliser le Enumerable.SequenceEqual
méthode d'extension:
Assert.IsTrue(actual.SequenceEqual(expected));
Une méthode d'aide personnalisée pourrait vous donner plus de détails sur la façon dont ils diffèrent, bien sûr. Vous pouvez trouver les méthodes dans MoreLINQ.TestExtensions
utile, même si elles sont assez grossières et prêtes aussi.
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];
Assert.AreEqual(System.Convert.ToBase64String(array1),
System.Convert.ToBase64String(array2));
La méthode Assert.AreEqual sous le capot finira par défaut par Object.Equals () pour les valeurs non nulles. L'implémentation par défaut d'Object.Equals () est l'égalité référentielle. Les 2 tableaux sont identiques en termes de valeur mais de référence et ne seront donc pas considérés comme égaux.
Création d'une méthode d'assistance simple:
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]);
}
}
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );
va comparer les trucs ... Cela fonctionne pour moi ..