Как сравнить списки в модульном тестировании

Как этот тест может провалиться?

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

Ответы на вопрос(5)

этот тест сравнивает ввод даты, проверяет, является ли ее високосным годом, если да, выводит 20 високосных лет от введенной даты, если нет,  выводит NEXT 20 високосных лет, myTest.Testing ссылается на экземпляр myTest, который, в свою очередь, вызывает значения из списка с именем Testing, содержащего требуемые вычисленные значения. часть упражнения, которую я должен был сделать.

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

Если вы хотите проверить, что каждый из них содержит одну и ту же коллекцию значений, вы должны использовать:

CollectionAssert.AreEquivalent(expected, actual);

Редактировать:

"Two collections are equivalent if they have the same elements in the same quantity, but in any order. Elements are equal if their values are equal, not if they refer to the same object." - https://msdn.microsoft.com/en-us/library/ms243779.aspx

Я пробовал другие ответы в этой теме, и они не работали для меня, и я сравнивал наборы объектов, которые имели одинаковые значения, сохраненные в их свойствах, но объекты были другими.

Вызов метода:

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);
        }
    }
 Ray Cheng15 июл. 2014 г., 17:59
Хорошее дополнение, или вы также можете переопределитьEquals метод иCollectionAssert буду работать.

Я думаю, это поможет

Assert.IsTrue(expected.SequenceEqual(actual));
 04 июн. 2016 г., 14:13
К сожалению, это действительно не так: «CollectionAssert.AreEqual не удалось. (Элемент с индексом 0 не совпадает.) & Quot; (каковы элементы?)
 15 июн. 2012 г., 19:48
Это был и мой запасной вариант, но я надеюсь, что CollectionAssert предоставит более полезные сообщения об ошибках.
Решение Вопроса

Чтобы сделать утверждения о коллекциях, вы должны использоватьCollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T> не переопределяетEquals, так что еслиAssert.AreEqual просто звонкиEquals, это в конечном итоге будет использовать равенство ссылок.

 17 окт. 2016 г., 22:40
@MarkSowul: Хм ... звучит так, что тогда стоит сообщить об ошибке. Нет причин, это должно быть так плохо.
 17 окт. 2016 г., 18:04
Обратите внимание, чтоCollectionAssert.AreEqual может быть заметно медленнее, чемAssert.IsTrue...SequenceEqual
 11 авг. 2016 г., 22:25
Если вас не заботит порядок элементов: {A, B, C} == {C, B, A}, используйтеCollectionAssert.AreEquivalent вместоmsdn.microsoft.com/en-us/library/ms243779.aspx
 17 окт. 2016 г., 18:28
@MarkSowul: Но это дает гораздо лучшую диагностику отказов, верно?
 15 мая 2015 г., 17:45
Я хотел бы, чтобы это дало более подробные сообщения, когда это не удалось & quot; Различное количество элементов & quot; и "Элемент с индексом 0 не совпадает" немного бесполезны.What are they then?!

Ваш ответ на вопрос