如何使用fluent-assertions声明集合中的所有项?

Spo*_*xus 19 c# collections unit-testing fluent-assertions

假设我想测试一个方法,使用fluent-assertions返回一堆以下类型的项,以确保所有项的IsActive-flag都设置为true:

public class Item
{
    public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我可以简单地迭代集合并在foreach循环中单独断言每个项目:

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

但是,是否有更流畅的方式同时断言整个系列中的每个项目?

p.s*_*w.g 36

也许是这样的:

items.Should().OnlyContain(x => x.IsActive, "because I said so!");
Run Code Online (Sandbox Code Playgroud)

请注意,最后一行(OnlyContain)强制.All(x => true)执行每个项目的前一行.

甚至更好:

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); 
Run Code Online (Sandbox Code Playgroud)

或者您可能想要的其他解决方案

items.Should().OnlyContain(x => x.IsActive, "because I said so!");
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,这两个选项并不等价: ```.OnlyContain``` 要求集合不为空,而 ```.All().Should().BeTrue()``` 则不然。 (2认同)

Joe*_*oel 6

像用 foreach 方法替换 foreach 循环之类的东西应该可以解决问题(至少有一点)。

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

我发现这种语法比传统的 foreach 循环更流畅:)

如果您的方法CreateABunchOfActiveItems返回 IEnumerable,则不会定义 ForEach 方法。但是它可以很容易地实现为一个扩展方法:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,“ToList()”已经枚举了原始集合,然后由“foreach”循环再次枚举... (2认同)

Grz*_*lko 5

使用,根据https://fluidassertions.com/collections/AllSatisfy()在 v. 6.5.0 中添加。

在你的情况下,它将是:

var items = CreateABunchOfActiveItems();
items.Should().AllSatisfy(
    i => i.IsActive.Should().BeTrue("because I said so!")
);
Run Code Online (Sandbox Code Playgroud)