ASP. Net XUnit проверяет, совпадает ли список объектов с конкретным объектом c - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь добавить в свой проект модульные тесты. Некоторые из этих тестов проверяют, не содержит ли список объектов объект. Чтобы проверить, содержит ли список объект, я пробовал Assert.Contains(MyList, ExpectedObject), но он по-прежнему выдает ошибку, в которой говорится, что список не содержит этого объекта. Даже когда я отлаживаю тест, я вижу, что объект правильно добавлен в список.

То же самое происходит с Assert.DoesNotContain(MyList, ExpectedObject). Когда я удаляю элемент из списка и выполняю эту проверку, он говорит, что его нет в списке. Но когда я больше не удаляю элемент, он все равно говорит, что его больше нет в списке. Даже если он все еще в списке.

Когда я пробую его с тестовым списком: List<string>. и выполните те же операции по добавлению и удалению элементов, а затем проверьте, есть ли эти элементы в списке или нет. Это действительно работает. Возможно, Assert.Contains не работает для списков объектов. Но компилятор ошибок не выдает. И я также уже проверил, относится ли ExpectedObject к тому же типу, что и объекты в списке.

Может быть, есть другой способ проверить, есть ли объект в списке или нет. любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

В вашем тесте ExpectedObject является фактическим объектом в списке или объектом с такими же значениями? В C# два объекта с одинаковыми значениями свойств фактически не равны. Я подозреваю, что именно поэтому ваш тест не проходит. Две строки с одинаковым значением считаются равными, потому что строковый объект реализует метод Equals (и еще ), как указывает @dorukerenaktas.

Есть несколько способов go об этом. Самый простой - проверить, находится ли объект с ожидаемыми значениями свойств в коллекции.

Существует перегрузка Assert.Contains, которая позволяет вам указать предикат, например:

Assert.Contains(MyList, item => item.Id == expectedId)

Другой вариант - переопределить метод Equals для вашего объекта, как объясняет @dorukerenaktas, но я бы рекомендовал это только в том случае, если это действительно имеет смысл для вашего класса. Я бы определенно не сделал бы это, чтобы вы могли использовать это в тесте.

0 голосов
/ 29 мая 2020

Я уже сталкивался с подобной проблемой раньше и использовал fluentAssertions для ее решения.

Так, например, если у вас есть список объектов под названием myList, этот фрагмент должен помочь.

myList.Should().Contain(expectedItem);

Здесь есть дополнительная информация о коллекциях: https://fluentassertions.com/collections/

Другой вариант - пролистать oop по списку и проверить, есть ли объекты равны вашему объекту. При этом, если вы используете метод ShouldBeEquivalentTo (), вам не нужно будет проверять равенство каждого свойства. Это очень полезно, если ваш объект большой или вложенный, поскольку этот метод рекурсивно проверяет каждое свойство.

actual.Should().BeEquivalentTo(expected);

Подробнее об этом здесь: https://fluentassertions.com/objectgraphs/

Мне нравится использовать fluentAssetions, потому что он делает мои тесты и утверждения более удобочитаемыми, а также предоставляет очень четкие сообщения, когда возникают ошибки или утверждения не работают, так что вы быстрее обнаружите проблему.

0 голосов
/ 29 мая 2020

Обычно в Java и C# реализации методов contains для списков объектов сравнивают их по методу equals . Если метод equals не указан для объекта по умолчанию, он будет искать уникальный идентификатор объекта или адрес памяти, это означает, что даже если было 2 объекта со всеми одинаковыми полями, они могут быть разными. Потому что они создавались отдельно и выделяли разные адреса оперативной памяти. Если вы хотите сравнить объекты, переопределите метод equals. Это позволит использовать метод contains для сравнения объектов друг с другом, используя ваш собственный метод сравнения.

Пример:

Допустим, у вас есть объект Person с такими полями, как id, name, mail и т. д. c. Если вы хотите, чтобы объекты были равны, если их идентификаторы совпадают, вы можете использовать:

// They are same person if their id is same
public override bool Equals(Object obj)
   {
      Person personObj = obj as Person;
      if (personObj == null)
         return false;
      else
         return idNumber.Equals(personObj.idNumber);
   }
...