web-dev-qa-db-fra.com

Comment comparer les listes dans les tests unitaires

Comment ce test peut-il échouer?

[TestMethod]
public void Get_Code()
{
    var expected = new List<int>();
    expected.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    var actual = new List<int>();
    actual.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    Assert.AreEqual(expected, actual);
    // Assert.AreSame(expected, actual)       fails
    // Assert.IsTrue(expected.Equals(actual)) fails
}
157
Ray Cheng

Pour faire des affirmations sur les collections, vous devez utiliser CollectionAssert :

CollectionAssert.AreEqual(expected, actual);

List<T> _ ne remplace pas Equals, donc si Assert.AreEqual appelle simplement Equals, il utilisera l’égalité de référence.

328
Jon Skeet

Je suppose que cela aidera

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

Si vous voulez vérifier que chacun contient la même collection de valeurs, vous devez utiliser:

CollectionAssert.AreEquivalent(expected, actual);

Modifier:

"Deux collections sont équivalentes si elles contiennent les mêmes éléments dans la même quantité, mais dans n'importe quel ordre. Les éléments sont égaux si leurs valeurs sont égales, et non s'ils se rapportent au même objet." - https://msdn.Microsoft.com/en-us/library/ms243779.aspx

15
topham101

J'ai essayé les autres réponses dans ce fil, mais elles ne fonctionnaient pas pour moi et je comparais des collections d'objets contenant les mêmes valeurs dans leurs propriétés, mais les objets étaient différents.

Appel de méthode:

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);

Méthode de comparaison:

private static void CompareIEnumerable<T>(IEnumerable<T> one, IEnumerable<T> two, Func<T, T, bool> comparisonFunction)
    {
        var oneArray = one as T[] ?? one.ToArray();
        var twoArray = two as T[] ?? two.ToArray();

        if (oneArray.Length != twoArray.Length)
        {
            Assert.Fail("Collections are not same length");
        }

        for (int i = 0; i < oneArray.Length; i++)
        {
            var isEqual = comparisonFunction(oneArray[i], twoArray[i]);
            Assert.IsTrue(isEqual);
        }
    }
14
Declan

ce test compare une entrée de date, vérifie si c'est une année bissextile, si c'est le cas, génère 20 années bissextiles à partir de la date entrée, sinon, génère les 20 prochaines années bissextiles, myTest.Testing fait référence à l'instance myTest qui appelle à son tour les valeurs à partir d'une liste appelée Testing contenant les valeurs calculées requises. partie d'un exercice que je devais faire.

[TestMethod]
        public void TestMethod1()
        {
            int testVal = 2012;
            TestClass myTest = new TestClass();
            var expected = new List<int>();
            expected.Add(2012);
            expected.Add(2016);
            expected.Add(2020);
            expected.Add(2024);
            expected.Add(2028);
            expected.Add(2032);
            expected.Add(2036);
            expected.Add(2040);
            expected.Add(2044);
            expected.Add(2048);
            expected.Add(2052);
            expected.Add(2056);
            expected.Add(2060);
            expected.Add(2064);
            expected.Add(2068);
            expected.Add(2072);
            expected.Add(2076);
            expected.Add(2080);
            expected.Add(2084);
            expected.Add(2088);
            var actual = myTest.Testing(2012);
            CollectionAssert.AreEqual(expected, actual);
        }
6
gettingThereSlowly