如何使用流畅断言断言集合中的所有项
本文关键字:断言 集合 何使用 | 更新日期: 2023-09-27 18:31:56
假设我想测试一个使用流畅断言返回一堆以下类型的项目的方法,以确保所有项目都将其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!");
}
但是,有没有一种更流畅的方法可以同时断言整个系列中的每个项目?
推荐的方法是使用 OnlyContain
:
items.Should().OnlyContain(x => x.IsActive, "because I said so!");
这些也将起作用:
items.All(x => x.IsActive).Should().BeTrue("because I said so!");
items.Select(x => x.IsActive.Should().BeTrue("because I said so!"))
.All(x => true);
请注意,最后一行 ( .All(x => true)
) 强制对每个项目执行前一个Select
。
像用
foreach方法替换foreach循环这样的事情应该可以解决问题(至少一点点)。
var items = CreateABunchOfActiveItems();
items.ForEach(item => item.IsActive.Should().BeTrue("because I said so, too!"));
我发现这种语法比传统的 foreach 循环:)更流畅一些
如果方法返回 IEnumerable,则不会定义 ForEach 方法CreateABunchOfActiveItems
。但它可以很容易地实现为扩展方法:
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()
,这是根据 https://fluentassertions.com/collections/在 v. 6.5.0 中添加的。
在您的情况下,它将是:
var items = CreateABunchOfActiveItems();
items.Should().AllSatisfy(
i => i.IsActive.Should().BeTrue("because I said so!")
);