FluentAssertions: эквивалентность отсортированных списков
Я пытаюсь установить эквивалентность двух списков с использованием FluentAssertions в С#, где важны две вещи:
- элементы сравниваются по значениям, которые они хранят, а не по ссылке (т.е. они эквивалентны, не равны)
- порядок элементов в списках важен.
Нет ли функции в FluentAssertions (или даже NUnit), которая делает это?
Ура!
Ответы
Ответ 1
По умолчанию ShouldBeEquivalentTo()
будет игнорировать порядок в коллекциях, поскольку в большинстве случаев две коллекции эквивалентны, если они содержат одинаковые элементы в любом порядке. Если вы заботитесь о порядке, просто используйте одну из перегруженных функций WithStrictOrdering()
для options =>
.
Пример:
var myList = Enumerable.Range(1, 5);
var expected = new[]
{
1, 2, 3, 4, 5
};
//succeeds
myList.ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
//fails
myList.Reverse().ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
Подробнее об этих опциях читайте в документации.
Ответ 2
Поздно к игре здесь, но я использую версию Fluent Assertions этого здесь:
actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
Он будет проверять все значения всех свойств для эквивалентности, и с этой опцией задает количество заказов. Если порядок не имеет значения, в этом случае опустите параметр param, и он убедится, что элемент из одного colection будет существовать где-то в другом.
Надеюсь, что это поможет кому-то.
Ответ 3
Я думаю, вы можете просто сделать:
myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
Это будет работать, только если элементы в списке равны при использовании Object.Equal(element1, element2)
если это не так, тогда вам нужно реализовать собственный EqualityComparer для объектов в списках, а затем использовать:
myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
.Should().BeTrue();
Ответ 4
Вам нужен метод ShouldAllBeEquivalentTo, который должен сравнивать значения свойств двух графов объектов в списке.
* Редактировать: я бы, вероятно, использовал последовательность Linq, равную пользовательскому средству сравнения на равенство, которое использует ShouldBeEquivalentTo, чтобы заботиться о порядке элементов.
Ответ 5
Во время моей борьбы с подобным заданием узнал о следующем методе:
IEnumerable collection = new[] { 1, 2, 5, 8 };
collection
.Should()
.ContainInOrder(new[] { 1, 5, 8 });
Сборник Утверждений Документов
Ответ 6
Я считаю, что нет. Но для этой цели вы всегда можете написать метис расширения. То есть.
public static void AreEqual<T>(this IList<T> left, IList<T> right)
{
Assert.AreEqual(left.Count, right.Count);
for (int i = 0; i < left.Count - 1; i++)
{
Assert.IsTrue(left[i].Equals(right[i]));
}
}
Ответ 7
Класс Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert может иметь метод, отвечающий вашим потребностям.
Метод CollectionAssert.AreEqual(ICollection, ICollection, IComparer) должен сделать трюк.
Две коллекции равны, если они имеют одинаковые элементы в одном и том же порядок и количество. Элементы равны, если их значения равны, а не если они относятся к одному и тому же объекту.