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