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