Как утверждать все элементы в коллекции, используя беглые утверждения?

Скажем, я хочу протестировать метод, возвращающий кучу элементов следующего типа, используя беглые утверждения, чтобы убедиться, что все элементы имеют свои IsActiveфлаг установлен в true:

public class Item
{
    public bool IsActive { get; set; }
}

Чтобы достичь этого, я мог бы просто перебрать коллекцию и утверждать каждый элемент отдельно в цикле foreach:

var items = CreateABunchOfActiveItems();
foreach (var item in items)
{
    item.IsActive.Should().BeTrue("because I said so!");
}

Но есть ли более быстрый способ утверждать каждый элемент во всей коллекции сразу?

3 ответа

Решение

Возможно, что-то вроде этого:

var items = CreateABunchOfActiveItems();
items.Select(x => x.IsActive.Should().BeTrue("because I said so!"))
     .All(x => true); 

Обратите внимание, что последняя строка (.All(x => true)) заставляет предыдущего Select выполнить для каждого элемента.

Или даже лучше:

var items = CreateABunchOfActiveItems();
items.Should().OnlyContain(x => x.IsActive, "because I said so!");

Или другое решение, которое вам может понравиться:

var items = CreateABunchOfActiveItems();
items.All(x => x.IsActive).Should().BeTrue("because I said so!");

Что-то вроде замены цикла foreach методом foreach должно помочь (по крайней мере, немного).

var items = CreateABunchOfActiveItems();
items.ForEach(item => item.IsActive.Should().BeTrue("because I said so, too!"));

Я нахожу этот синтаксис немного более свободным, чем традиционный цикл foreach:)

Метод ForEach не определен, если ваш метод CreateABunchOfActiveItems возвращает IEnumerable Но это может быть легко реализовано как метод расширения:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, 
    Action<T> action)
{
    // I use ToList() to force a copy, otherwise your action 
    // coud affect your original collection of items!. If you are confortable 
    // with that, you can ommit it
    foreach (T item in enumeration.ToList())
    {
        action(item);
        yield return item;
    }
}

ИспользоватьAllSatisfy(), который был добавлен в версии 6.5.0 согласно https://fluentassertions.com/collections/ .

В вашем случае это будет:

      var items = CreateABunchOfActiveItems();
items.Should().AllSatisfy(
    i => i.IsActive.Should().BeTrue("because I said so!")
);
Другие вопросы по тегам