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

时间:2013-09-19 16:08:07

标签: c# unit-testing collections fluent-assertions

假设我想测试一个方法,使用fluent-assertions返回一堆具有以下类型的项目,以确保所有项目的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!");
}

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

2 个答案:

答案 0 :(得分:33)

也许是这样的:

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

答案 1 :(得分:4)

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

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

我发现这种语法比传统的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;
    }
}