XUnit: Утвердить два списка <T> равны?

Я новичок в TDD и xUnit, поэтому я хочу проверить мой метод, который выглядит примерно так:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

Есть ли метод Assert, который я могу использовать? Я думаю, что-то вроде этого было бы хорошо

    List<int> values = new List<int>() { 1, 2, 3 };
    List<int> expected = new List<int>() { 1 };
    List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

    Assert.Exact(expected, actual);

Есть ли что-то подобное?

Ответ 1

xUnit.Net распознает коллекции, так что вам просто нужно сделать

Assert.Equal(expected, actual); // Order is important

Вы можете увидеть другие доступные утверждения коллекции в CollectionAsserts.cs

Для библиотеки сравнения NUnit методы сравнения

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

а также

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Подробнее здесь: CollectionAssert

MbUnit также имеет утверждения коллекции, аналогичные NUnit: Assert.Collections.cs

Ответ 2

В текущей версии XUnit (1.5) вы можете просто использовать

Assert.Equal(ожидается, актуально);

Вышеуказанный метод будет выполнять элемент по сравнению с двумя списками. Я не уверен, что это работает для любой предыдущей версии.

Ответ 3

С помощью xUnit, если вы хотите, чтобы вишня выбирала свойства каждого элемента для проверки, вы можете использовать Assert.Collection.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Это проверяет ожидаемое количество и гарантирует, что каждое действие будет проверено.

Ответ 4

Недавно я использовал пакеты xUnit 2.4.0 и Moq 4.10.1 в своем приложении asp.net core 2.2.

В моем случае мне удалось заставить его работать в два этапа:

  1. Определение реализации IEqualityComparer<T>
  2. Передайте экземпляр средства Assert.True в качестве третьего параметра в метод Assert.True:

    Assert.True(expected, actual, new MyEqualityComparer());

Но есть и другой, более приятный способ получить тот же результат, используя пакет FluentAssertions. Это позволяет вам делать следующее:

// Assert          
expected.Should().BeEquivalentTo(actual));

Интересно, что Assert.Equal() всегда терпит неудачу, даже когда я заказывал элементы двух списков, чтобы получить их в одном и том же порядке.