Подтвердить что ты не робот

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

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

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

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

Ура!

4b9b3361

Ответ 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) должен сделать трюк.

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