Подтвердить что ты не робот

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

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

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

Ответ 1

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

CollectionAssert.AreEqual(expected, actual);

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

CollectionAssert.AreEquivalent(expected, actual);

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

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

Ответ 5

этот тест сравнивает ввод даты, проверяет, если его високосный год, если это так, выводит 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);
        }