Как проверить, что несколько видов были применены к коллекции? - PullRequest
0 голосов
/ 02 июля 2018

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

Естественно, я начинаю с написания модульного теста, чтобы можно было убедиться, что сортировка (по умолчанию) выполняется сначала по Ref по возрастанию, а затем Name по возрастанию.

Поставщики тестов, о которых идет речь, находятся здесь:

_context.Suppliers.Add(new Supplier { Ref = "abc", Name = "steve"});
_context.Suppliers.Add(new Supplier { Ref = "abc", Name = "bob"});    
_context.Suppliers.Add(new Supplier { Ref = "cde", Name = "ian"});    
_context.Suppliers.Add(new Supplier { Ref = "fgh", Name = "dan"}); 

Тогда я иду и спрашиваю тест для моих отсортированных поставщиков.

Свободные утверждения, которые я знаю, имеют методы BeInAscendingOrder и BeInDescendingOrder, однако даже после просмотра документации и после возможных связанных вопросов Я не смог увидеть пример методов сортировки по цепочке.

Моя текущая проверка теста выглядит следующим образом:

results.Should().HaveCount(4).And.BeInAscendingOrder(x => x.Ref)
           .And.BeInAscendingOrder(x => x.Name);

Я ожидал, что проверка будет работать примерно так же, как LINQ, где она имеет OrderBy(x => x.Ref).ThenBy(x => x.Name).

Однако при запуске теста он не проходит, поскольку ожидает, что коллекция будет упорядочена по возрастанию на Name (окончательное утверждение сортировки).

Есть ли способ сказать Свободным Утверждениям, что сортировки должны применяться в сочетании друг с другом, а не только в последовательности?

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Итак, я попробовал комментарии Фабио / Стюарта об использовании WithStrictOrdering, и какое-то время это работало.

Однако, когда я пришел изменить порядок сортировки, мои тесты продолжали проходить, а не проваливаться (потому что я изменил сортировку в моем тесте, но не в методе).

Замечательно сработало следующее:

var resultsList = results.ToList();
var expectedResults = resultsList.OrderByDescending(x => x.IsSupplierInvalid)
                                        .ThenBy(x => x.Ref).ToList();
resultsList.Should().HaveCount(4).And.ContainInOrder(expectedResults);
0 голосов
/ 03 июля 2018

Одним из способов является использование этой перегрузки BeInAscendingOrder:

BeInAscendingOrder(IComparer<T> comparer, string because = "", params object[] args)

, а затем создайте SupplierComparer, который наследуется от Comparer<Supplier>.

Вот полный пример

class Supplier
{
    public string Ref { get; set; }
    public string Name { get; set; }
}

class SupplierComparer : Comparer<Supplier>
{
    public override int Compare(Supplier x, Supplier y)
    {
        var compareRef = x.Ref.CompareTo(y.Ref);
        if (compareRef != 0)
        {
            return compareRef;
        }

        var compareName = x.Name.CompareTo(y.Name);
        if (compareName != 0)
        {
            return compareName;
        }

        return 0;
    }
}

public void MyTestMethod()
{
    var suppliers = new[]
    {
        new Supplier { Ref = "abc", Name = "steve" },
        new Supplier { Ref = "abc", Name = "bob" },
        new Supplier { Ref = "cde", Name = "ian" },
        new Supplier { Ref = "fgh", Name = "dan" }
    };

    var comparer = new SupplierComparer();
    suppliers.Should().BeInAscendingOrder(comparer);
}
...