Сравнение двух объектов с помощью 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 находится в следующем расположении и подробно описывает различные типы утверждений, которые могут быть сделаны на сборники

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx

однако, как упоминалось в @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, но я не думаю, что это подходит для модульных тестов, потому что вы хотите, чтобы они работали всегда как можно быстрее.