26

假设我想使用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!");
}

但是有没有更流畅的方法来一次断言整个集合中的每个项目?

4

2 回答 2

52

推荐的方法是使用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为每个项目执行前一行。

于 2013-09-19T16:09:58.143 回答
6

用 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;
    }
}
于 2013-09-19T16:39:17.270 回答