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

Как утверждать все предметы в коллекции с помощью флагов-утверждений?

Скажем, я хочу протестировать метод, возвращающий кучу элементов следующего типа, используя fluent-assertions, чтобы гарантировать, что все элементы имеют набор IsActive -flag до 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!");
}

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

4b9b3361

Ответ 1

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

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!");

Ответ 2

Что-то вроде замены вашего цикла 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;
    }
}