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.
В моем случае мне удалось заставить его работать в два этапа:
- Определение реализации
IEqualityComparer<T>
-
Передайте экземпляр средства Assert.True
в качестве третьего параметра в метод Assert.True
:
Assert.True(expected, actual, new MyEqualityComparer());
Но есть и другой, более приятный способ получить тот же результат, используя пакет FluentAssertions. Это позволяет вам делать следующее:
// Assert
expected.Should().BeEquivalentTo(actual));
Интересно, что Assert.Equal()
всегда терпит неудачу, даже когда я заказывал элементы двух списков, чтобы получить их в одном и том же порядке.