web-dev-qa-db-fra.com

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

82
David Anderson

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 () .

134
tvanfosson

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.

41
Jon Skeet
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));
4
José Brazeta

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.

2
JaredPar

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

0
user2682078