Подтвердить что ты не робот

Сравнение двух объектов с использованием Assert.AreEqual()

Я впервые записываю тестовые примеры в visual studio С# У меня есть метод, который возвращает список объектов, и я хочу сравнить его с другим списком объектов с помощью метода Assert.AreEqual().

Я попытался сделать это, но утверждение терпит неудачу, даже если оба объекта идентичны.

Мне хотелось узнать, сравнивает ли этот метод два параметра ссылки или содержимое объекта,

Нужно ли мне перегружать оператор ==, чтобы сделать это?

4b9b3361

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