Плавные утверждения: Эквивалентность двух списков массивов, при этом массивы нуждаются в строгом упорядочении

#c# #unit-testing #fluent-assertions

Вопрос:

Я пытаюсь использовать свободные утверждения для тестирования алгоритма генерации перестановок. Алгоритм генерирует a List<int[]> , где List порядок не имеет значения, но элементы каждого int[] имеют значение.

 [Fact]
public void Are_all_permutations_generated()
{
    // Arrange
    var expected = new List<int[]>
    {
        new[] { 1, 2, 3 },
        new[] { 1, 3, 2 },
        new[] { 2, 1, 3 },
        new[] { 2, 3, 1 },
        new[] { 3, 1, 2 },
        new[] { 3, 2, 1 }
    };

    // Act
    var result = new List<int[]>
    {
        new[] { 3, 2, 1 },
        new[] { 1, 3, 2 },
        new[] { 2, 3, 1 },
        new[] { 2, 1, 3 },
        new[] { 3, 1, 2 },
        new[] { 1, 2, 3 }
    };

    // Assert
    result.Should().BeEquivalentTo(expected);
}
 

Если я использую result.Should().BeEquivalentTo(expected) , как в приведенном выше блоке кода, он пройдет, даже если result был

 var result = new List<int[]>
{
    new[] { 1, 2, 3 },
    new[] { 1, 2, 3 },
    new[] { 1, 2, 3 },
    new[] { 1, 2, 3 },
    new[] { 1, 2, 3 },
    new[] { 1, 2, 3 }
};
 

Как я могу написать утверждения Fluent, чтобы разрешить любой порядок для списка, но иметь строгий порядок для массивов, чтобы он мог утверждать, что все перестановки были найдены? Есть ли какой-то способ написать options в BeEquivalentTo , чтобы сделать это?

Ответ №1:

Используется WithStrictOrderingFor для определения того, хотите ли вы использовать строгий порядок или нет. Для этого требуется лямбда , которая предоставляет вам доступ к IObjectInfo объекту, предоставляющему всю необходимую информацию, которую вы можете использовать. Что-то вроде

 WithStrictOrderingFor(info => info.RuntimeType == typeof(int[]))
 

Ответ №2:

Вы можете попробовать использовать WithStrictOrdering утверждение массива.

Например:

 result.Should().BeEquivalentTo(expected, options => options.WithStrictOrdering());
 

Кроме того, вы можете ознакомиться с документами по утверждению коллекции из FluentAssertion, они предоставляют больше возможностей для сравнения коллекций.

Комментарии:

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