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?
c#
unit-testing
assert
David Anderson
la source
la source
Assert.AreEqual
fonctionnera correctement.Réponses:
Assert.Equals
tests utilisant laEquals
méthode, qui par défaut utilise l'égalité de référence et, comme ce sont des 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 CollectionAssert.AreEqual () à la place.la source
ICollection
, bien sûr. C'est même unIList
. Il est important que votre «égalité de collection» considère l'ordre (c'est-à-dire que les collections doivent être égales en tant que séquences, pas seulement en tant qu'ensembles mathématiques).Parce que les tableaux ne remplacent pas
Equals
.Vous n'avez pas dit quel framework de test vous utilisez, mais en gros, ce serait à ce framework de gérer des tableaux de cas spéciaux. Vous pouvez toujours implémenter votre propre méthode d'assistance pour ce faire, bien sûr. J'ai fait ça parfois. Pour un hack rapide et sale, si vous utilisez .NET 3.5, vous pouvez utiliser la
Enumerable.SequenceEqual
méthode d'extension:Une méthode d'assistance personnalisée pourrait vous donner plus de détails sur leurs différences, bien sûr. Vous trouverez peut-être les méthodes
MoreLINQ.TestExtensions
utiles, même si elles sont assez approximatives et prêtes aussi.la source
//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 source
La méthode Assert.AreEqual sous le capot finira par utiliser par défaut 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 diffèrent en termes de référence et ne seront donc pas considérés comme égaux.
la source
byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );
va comparer les trucs ... ça marche pour moi ..
la source
Création d'une méthode d'aide 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]); } }
la source