FluentAssertions: эквивалентность отсортированных списков

Я пытаюсь установить эквивалентность двух списков, используя FluentAssertions в С#, где важны две вещи:

  1. элементы сравниваются по значениям, которые они содержат, а не по ссылке (т.е. они эквивалентны, а не равны)
  2. порядок элементов в списках важен

Нет ли в FluentAssertions (или даже в NUnit) функции, которая это делает?

Ваше здоровье!


person Samuel Neugber    schedule 10.10.2014    source источник


Ответы (8)


По умолчанию 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());

Подробнее об этих параметрах читайте в документации.

person Dennis Doomen    schedule 10.10.2014
comment
Идеально, именно то, на что я надеялся. Спасибо, что познакомили меня с параметром options! :) - person Samuel Neugber; 10.10.2014
comment
Мне потребовалось слишком много времени, чтобы понять, что Should().BeEquivalentTo(), по-видимому, не то же самое, что ShouldBeEquivalentTo().... - person RJB; 24.08.2017
comment
Я исправляю это в 5.0. См. github.com/fluentassertions/fluentassertions/pull/593. - person Dennis Doomen; 25.08.2017
comment
По какой-то конкретной причине NotBeEquivalentTo не имеет перегрузки с параметрами? Мне нужно проверить, что два перечислимых эквивалентны, но не в том же порядке. - person Toby; 20.08.2019

Поздно в игру здесь, но я использую версию Fluent Assertions этого здесь:

actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

Он проверит все значения всех свойств на эквивалентность, и с этой опцией порядок имеет значение. Если порядок не имеет значения, опустите параметр options, и он будет гарантировать, что элемент из одной коллекции будет существовать где-то в другой. Надеюсь, это поможет кому-то

person Marc Ziss    schedule 14.03.2017
comment
С последним nuget fluentassertions вы должны использовать его следующим образом: - person thomasgalliker; 13.05.2020

Я думаю, вы можете просто сделать:

myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();

Это будет работать, только если элементы в списке равны при использовании Object.Equal(element1, element2)

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

myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
             .Should().BeTrue();
person Sam Holder    schedule 10.10.2014
comment
Я считаю, что это настолько аккуратно, насколько это возможно. Спасибо! - person Samuel Neugber; 10.10.2014

Из этот пост.

Новая функция ShouldBeEquivalentTo(), представленная в FA 2.0, выполняет углубленное структурное сравнение, а также сообщает о любых различиях.

Вы можете достичь этого таким образом.

actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
person Nguyễn Văn Phong    schedule 25.02.2020

Вам нужен метод ShouldAllBeEquivalentTo, который должен сравнивать значения свойств двух графов объектов в списке.

* Редактировать: я бы, вероятно, использовал последовательность Linq equal с пользовательским компаратором равенства, который использует ShouldBeEquivalentTo для заботы о порядке элементов.

person gmn    schedule 10.10.2014
comment
Уже пробовал это, не заботится о порядке элементов. Изменить -> Это была и моя мысль, я просто надеялся, что где-то пропустил какую-то функцию. - person Samuel Neugber; 10.10.2014
comment
Может быть, тогда попробуйте SequenceEqual и собственный компаратор равенства. - person gmn; 10.10.2014

Во время моей борьбы с подобной задачей узнал о следующем методе:

IEnumerable collection = new[] { 1, 2, 5, 8 };

collection
    .Should()
    .ContainInOrder(new[] { 1, 5, 8 });

Документы по утверждению коллекции

person Guru Stron    schedule 26.01.2018

Для части 2 этого вопроса, проверяя порядок элементов в коллекции, по состоянию на 2020 год (не знаю, какая версия была введена, в настоящее время я использую v5.10.3), вы можете использовать:

mySimpleCollection.Should().BeInDescendingOrder() or myComplexCollection.Should().BeInDescendingOrder(x => x.SomeProperty)

OR

mySimpleCollection.Should().BeInAscendingOrder() or myComplexCollection.Should().BeInAscendingOrder(x => x.SomeProperty)

OR

mySimpleCollection.Should().NotBeInAscendingOrder() or myComplexCollection.Should().NotBeInAscendingOrder(x => x.SomeProperty)

OR

mySimpleCollection.Should().NotBeInDescendingOrder() or myComplexCollection.Should().NotBeInDescendingOrder(x => x.SomeProperty)

person Vergil C.    schedule 13.04.2020

Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert класс может иметь метод, отвечающий вашим потребностям.

CollectionAssert.AreEqual Method (ICollection, ICollection, IComparer) должен помочь .

Две коллекции равны, если они содержат одни и те же элементы в одном порядке и в одном количестве. Элементы равны, если их значения равны, а не если они относятся к одному и тому же объекту.

person Orace    schedule 10.10.2014