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

c# visual-studio-2010 unit-testing mstest

78313 просмотра

5 ответа

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

[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
}
Автор: Ray Cheng Источник Размещён: 12.11.2019 09:10

Ответы (5)


337 плюса

Решение

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

CollectionAssert.AreEqual(expected, actual);

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

Автор: Jon Skeet Размещён: 15.06.2012 05:43

31 плюса

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

Assert.IsTrue(expected.SequenceEqual(actual));
Автор: Shyju Размещён: 15.06.2012 05:47

15 плюса

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

CollectionAssert.AreEquivalent(expected, actual);

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

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

Автор: topham101 Размещён: 14.08.2017 09:56

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);
        }
    }
Автор: Declan Размещён: 15.07.2014 12:26

6 плюса

этот тест сравнивает ввод даты, проверяет, является ли ее високосным годом, если да, выводит 20 високосных лет от введенной даты, если нет, выводит СЛЕДУЮЩИЕ 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);
        }
Автор: gettingThereSlowly Размещён: 13.06.2013 07:50
Вопросы из категории :
32x32