Как сравнивать списки в модульном тестировании
Как этот тест может провалиться?
[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
}
Ответы
Ответ 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);
}