代码之家  ›  专栏  ›  技术社区  ›  Spontifixus

如何使用流畅的断言来断言集合中的所有项?

  •  32
  • Spontifixus  · 技术社区  · 11 年前

    假设我想测试一个方法,该方法使用 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 回复  |  直到 11 年前
        1
  •  61
  •   Todd Menier    5 年前

    推荐的方法是使用 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 以针对每个项目执行。

        2
  •  6
  •   Joel user3568717    11 年前

    像用foreach方法替换foreach循环这样的方法应该可以做到(至少有一点)。

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

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