Сравнение двух объектов с использованием Assert.AreEqual()
Я впервые записываю тестовые примеры в visual studio С# У меня есть метод, который возвращает список объектов, и я хочу сравнить его с другим списком объектов с помощью метода Assert.AreEqual()
.
Я попытался сделать это, но утверждение терпит неудачу, даже если оба объекта идентичны.
Мне хотелось узнать, сравнивает ли этот метод два параметра ссылки или содержимое объекта,
Нужно ли мне перегружать оператор ==
, чтобы сделать это?
Ответы
Ответ 1
Если вы используете NUnit
, это то, что говорится в документации
Начиная с версии 2.2, особое положение также предусмотрено для сравнение одномерных массивов. Два массива будут обрабатываться как равный Assert.AreEqual, если они имеют одинаковую длину и каждый из соответствующие элементы равны. Примечание. Многомерные массивы, вложенные массивы (массивы массивов) и другие типы коллекций, такие как ArrayList в настоящее время не поддерживается.
В общем случае, если вы сравниваете два объекта и хотите иметь равноценное значение, вы должны переопределить метод Equals
.
Чтобы добиться того, что вы ищете, попробуйте что-то вроде этого:
class Person
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public override bool Equals(object other)
{
var toCompareWith = other as Person;
if (toCompareWith == null)
return false;
return this.Firstname == toCompareWith.Firstname &&
this.Lastname == toCompareWith.Lastname;
}
}
и в unit test:
Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());
Ответ 2
Эти ответы слишком сложны для этой проблемы. Для сравнения двух списков нет переопределений, и вам не нужно вызывать несколько утверждений.
Microsoft использует следующий класс CollectionAssert.
CollectionAssert.AreEqual(expectedList, actualList)
Это работает для списков, словарей и любого другого, реализующего интерфейс ICollection.
Документация microsoft находится в следующем месте и подробно описывает различные типы утверждений, которые могут быть сделаны в коллекциях
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx
Однако, как упоминалось в @Bart, это не работает должным образом в списках (сложных) объектов, а метод Equals все равно может быть перезаписан для этих случаев.
Ответ 3
Вы можете сериализовать их и протестировать результирующую строку.
Ответ 4
Assert.AreEqual в xUnit
на .NET проверит, идентичны ли объекты, но идентичность объекта отличается от ценности равнозначности, казалось бы, вы ищете равноценность значения. То есть. "Являются ли объекты в моем списке одинаковыми?" поэтому "не удается" два списка не идентичны, даже если значения каждого объекта в каждом списке могут представлять одно и то же значение.
Обычно в процессе тестирования должно быть достаточно, чтобы проверить количество элементов коллекции и ключевых элементов.
var count = listA.Count;
Assert.AreEqual(count,listB.Count);
Assert.AreEqual(listA.First(),listB.first());
Assert.AreEqual(listA.Last(),listB.Last());
Assert.AreEqual(listA[count/2],[count/2]);
Последний тест не должен быть в среднем элементе и просто предназначен для проверки элемента в списке, единственной причиной, по которой это не случайный элемент, потому что вы хотели бы иметь возможность воспроизводить результаты теста.
Ответ 5
Assert.AreEqual() сравнивает ссылки. Обычно при сравнении списков я сравниваю количество элементов и некоторые свойства одного точного элемента в списке или непосредственно элемент в списке (но опять же это ссылка).
Если вы хотите сравнивать объекты по контенту, то вам придется реализовать некоторый рекурсивный Object Comparer, но я не думаю, что он подходит для тестов единиц, потому что вы хотите, чтобы они выполнялись всегда как можно быстрее.