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


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

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

        var actual = new List<int>();
        actual.Add(100);
        actual.Add(400);
        actual.Add(200);
        actual.Add(900);
        actual.Add(2300);
        actual.Add(1900);

        Assert.AreEqual(expected, actual); //AreSame(expected, actual) and IsTrue(expected.Equals(actual))  fails too
    }
5 125

5 ответов:

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

CollectionAssert.AreEqual(expected, actual);

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

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

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

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

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

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

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

CollectionAssert.AreEquivalent(expected, actual);

Edit:

" две коллекции эквивалентны, если они имеют одинаковые элементы в одинаковом количестве, но в любом порядке. Элементы равны, если их значения равны, а не если они относятся к одному и тому же объекту."- https://msdn.microsoft.com/en-us/library/ms243779.aspx

этот тест сравнивает ввод даты, проверяет, является ли его високосным годом, если да, то выводит 20 високосных лет из введенной даты, если нет, выходы следующие 20 високосных лет, мой тест.Тестирование относится к экземпляру 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);
        }