如何使用流利断言断言集合中的所有项目?

Posted

技术标签:

【中文标题】如何使用流利断言断言集合中的所有项目?【英文标题】:How to assert all items in a collection using fluent-assertions? 【发布时间】:2013-09-24 20:05:58 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

值得一提的是,这两个选项并不等价:.OnlyContain 要求集合不为空,而.All().Should().BeTrue() - 不等。【参考方案2】:

用 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;
    

【讨论】:

这也是一种有效的方法 - 并且有提供 ForEach-extension 的库。但我主要是在寻找是否有一种方法可以使用 fluent-assertion 库本地执行这种操作。 还要注意,ToList() 已经枚举了原始集合,然后由foreach-loop 再次枚举... 是的,我知道这可能不是处理繁重操作(许多项目、数据库连接、文件读取等)时的最佳方法,但它适合我的日常测试。跨度>

以上是关于如何使用流利断言断言集合中的所有项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用流利的断言比较列表?

流利的断言;结合集合和对象图比较断言

如何使用流利的断言报告对象的名称

流利的断言:大约比较两个数字集合

如何使用流利的断言比较对象图中的嵌套列表

流利的断言 - 如何在类型检查后正确链接