Як порівняти списки в одиничному тестуванні


181

Як цей тест може провалитися?

[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
}

Відповіді:


371

Щоб стверджувати про колекції, слід використовувати CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>не переосмислює Equals, тож якщо Assert.AreEqualпросто зателефонувати Equals, то в кінцевому підсумку буде використано опорну рівність.


6
Я хотів би, щоб це дало більш детальні повідомлення, коли це не вдалося. "Різна кількість елементів" і "Елемент в індексі 0 не збігаються" є трохи марними. Що вони тоді ?!
Полковник Паніка

32
Якщо ви не переймаєтесь порядком елементів: {A, B, C} == {C, B, A}, тоді CollectionAssert.AreEquivalentзамість цього використовуйте msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
Зауважте, що це CollectionAssert.AreEqualможе бути помітно повільніше, ніжAssert.IsTrue...SequenceEqual
Марк Совул

1
@MarkSowul: Але це має набагато кращу діагностику відмов, правда?
Джон Скіт

2
@MarkSowul: Хм ... звучить так, що варто повідомити про помилку. Немає причин, щоб це було так погано.
Джон Скіт

34

Я думаю, це допоможе

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

4
Це було і моїм відпадом, але я сподіваюся, що CollectionAssert надасть корисніші повідомлення про помилки.
Джон Скіт

4
На жаль, це насправді: "CollectionAssert.AreEqual не вдалося. (Елемент в індексі 0 не відповідає.)" (Які елементи?)
namey

17

Якщо ви хочете перевірити, чи кожне містить однакову колекцію значень, тоді вам слід використовувати:

CollectionAssert.AreEquivalent(expected, actual);

Редагувати:

"Дві колекції рівноцінні, якщо вони мають однакові елементи в одній кількості, але в будь-якому порядку. Елементи рівні, якщо їх значення рівні, а не якщо вони посилаються на один і той же об'єкт." - https://msdn.microsoft.com/en-us/library/ms243779.aspx


14

Я спробував інші відповіді в цій темі, і вони не працювали для мене, і я порівнював колекції об'єктів, які мали однакові значення, збережені у своїх властивостях, але об'єкти були різними.

Метод виклику:

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

Метод порівняння:

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);
        }
    }

3
Приємне доповнення, або ви також можете перекрити Equalsметод, і CollectionAssertволя спрацює.
Рей Ченг

6

цей тест порівнює дату введення дати, перевіряє, чи є її високосний рік, якщо так, то виводиться 20 високосних років із введеної дати, якщо ні, виводиться NEXT 20 високосних років, myTest.Testing посилається на екземпляр myTest, який у свою чергу викликає значення зі списку під назвою Тестування, що містить необхідні розрахункові значення. частина вправи, яку я повинен був зробити.

[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);
        }

0
List<AdminUser> adminDetailsExpected = new List<AdminUser>()
{
new AdminUser  {firstName = "test1" , lastName = "test1" , userId = 
"001test1"  },
new AdminUser {firstName = "test2" , lastName = "test2" , userId = 
"002test2"   }
};

// Діяти

List<AdminUser> adminDetailsActual = RetrieveAdmin(); // your retrieve logic goes here

// Затвердження

Assert.AreEqual(adminDetailsExpected.Count, adminDetailsActual.Count);  //Test succeeds if the count matches else fails. This count can be used as a work around to test

0

Вільне твердження робить глибоке порівняння масивів actualArray.Should().BeEquivalentTo(expectedArray)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.