87 votes

Pourquoi Assert.AreEqual (T obj1, Tobj2) échoue avec des tableaux d'octets identiques

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'au octet même. Dans ce scénario, pourquoi Assert.AreEqual échoue?

143voto

tvanfosson Points 268301

Assert.Equals tests à l'aide de l' Equals méthode, qui utilise par défaut la référence à l'égalité et, depuis qu'ils sont différents des objets, ils ne sont pas égaux. Vous aurez envie de comparer chaque octet dans le tableau et vérifier qu'ils sont égaux. Une façon de le faire est de les convertir à quelque chose qui implémente ICollection et l'utilisation CollectionAssert.AreEqual() à la place.

47voto

Jon Skeet Points 692016

Car les tableaux ne pas surcharger Equals.

Vous n'avez pas dit qui test framework que vous utilisez, mais, fondamentalement, il appartient au cadre spéciales aux tableaux. Vous pouvez toujours mettre en place votre propre méthode d'aide pour le faire, bien sûr. Je l'ai fait parfois. Pour un accès rapide et sale hack, si vous êtes en utilisant .NET 3.5, vous pouvez utiliser l' Enumerable.SequenceEqual méthode d'extension:

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

Un helper personnalisé méthode pourrait vous donner plus de détails sur la façon dont ils diffèrent, bien sûr. Vous trouverez peut-être les méthodes en MoreLINQ.TestExtensions utile, même si ils sont assez grossiers.

5voto

José Brazeta Points 29
byte[] array1 = new byte[0];//Initialize your array here
byte[] array2 = new byte[0];//Initialize your array here
Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));

2voto

JaredPar Points 333733

La méthode Assert.AreEqual sous le capot finira par défaut à Object.Equals () pour les valeurs non NULL. L'implémentation par défaut de Object.Equals () est l'égalité référentielle. Les deux tableaux ont une valeur identique mais une différence de référence et ne seront donc pas considérés comme égaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X