Сравнение двух объектов с помощью Assert.AreEqual()
Я пишу тестовые примеры впервые в visual studio C# у меня есть метод, который возвращает список объектов, и я хочу сравнить его с другим списком объектов с помощью Assert.AreEqual()
метод.
Я попытался сделать это, но утверждение терпит неудачу, даже если два объекта идентичны.
Я хотел знать, если этот метод, два параметра сравнивают ссылки или содержимое объекта,
мне нужно перегрузить ==
оператору эта работа?
5 ответов
если вы используете NUnit
вот что говорится в документации
начиная с версии 2.2, специальное положение по сравнение одномерных массивов. Два массива будут рассматриваться как равны по утверждению.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;
}
}
и в тестовой блок:
Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());
эти ответы слишком сложны для проблемы. Нет никаких переопределений, необходимых для сравнения двух списков, и вам не нужно разбивать несколько утверждений. Microsoft использует следующий класс CollectionAssert.
CollectionAssert.AreEqual(expectedList, actualList)
это работает для списков, словарей и всего остального, что реализует интерфейс ICollection.
документация microsoft находится в следующем расположении и подробно описывает различные типы утверждений, которые могут быть сделаны на сборники
однако, как упоминалось в @Bart, это не работает должным образом в списках (сложных) объектов, и метод Equals все равно может потребоваться перезаписать для этих случаев.
Assert.AreEqual в xUnit
на .NET проверит, являются ли объекты одинаковых однако идентичность объекта отличается от равенства значений, казалось бы, вы ищете равенство значений. То есть. - Предметы в моем списке имеют одинаковую ценность?"вот почему он" терпит неудачу " два списка не идентичны, даже если значения каждого объекта в каждом списке могут представлять одно и то же значение.
обычно в усилии испытания должно быть достаточно испытать отсчет a коллекция и ключевые элементы.
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],listB[count/2]);
последний тест не должен быть в середине элемента и просто хотел проверить элемент в списке единственная причина, почему это не случайный элемент, потому что вы хотите быть в состоянии воспроизвести результаты ваших анализов.
Assert.AreEqual() сравнивает ссылки. Обычно при сравнении списков я сравниваю количество элементов и некоторые свойства одного точного элемента в списке или непосредственно элемента в списке (но опять же это ссылка).
Если вы хотите сравнить объекты по контенту, вам придется реализовать некоторый рекурсивный объект Comparer, но я не думаю, что это подходит для модульных тестов, потому что вы хотите, чтобы они работали всегда как можно быстрее.