流利的断言应该大于总是通过

Posted

技术标签:

【中文标题】流利的断言应该大于总是通过【英文标题】:Fluent assertion should be greater than always pass 【发布时间】:2018-10-16 21:12:36 【问题描述】:

我正在尝试使用以下方法测试我的收藏:

  var costByFactoryt = dataAccess.GetcostPerFactoryt(null, null);
  costByFactoryt.Count().Should().BeGreaterThan(0);
  costByFactoryt.Select(x => x.Cost.Should().BeGreaterThan(100));

但问题是,如果我把最后一行代码改成,

 costByFactoryt.Select(x => x.Cost.Should().BeGreaterThan(1000));

costingByCircuit.Select(x => x.Cost.Should().BeLessThan(100));

它仍然通过,这是错误的。

我要测试的是,所有成本都应该大于 100。

【问题讨论】:

不要使用 select,而是遍历集合... 将全选改为全部 其实这个问题和Fluent Assertions无关 【参考方案1】:

这种方式根本行不通,因为 LINQ Select 不会迭代集合 => 没有执行您的测试代码

根据Fluent Assertions documentation

正确的语法应该是

costingByCircuit.Select(x => x.Cost).Should().OnlyContain(x => x > 100);

【讨论】:

OP 想用FluentAssertions测试列表中的所有项目大于100 因为FluentAssertionsLINQ 是这样设计的,LINQ Select 不会迭代集合,因此不会执行测试代码 您能否将其添加到答案中,即使您回答提供的解决方案也缺乏解释。 更新了@Fabio,还添加了官方文档的参考链接【参考方案2】:

那么写costByFactoryt.Select(x => x.Cost.Should().BeGreaterThan(100)); 的问题是它什么都不测试。 它创建了一个从不迭代的惰性 LINQ 表达式,即不会调用任何 BeGreaterThan

在使用 Fluent Assertions 时,您将获得最详细的失败消息,而您可以避免使用 Select,因为更多信息随后可供失败消息生成器使用。

什么时候

costByFactoryt.Select(x => x.Cost).Should().OnlyContain(x => x > 100)

失败,消息生成器将输出Cost 对象。

改为写

costByFactoryt.Should().OnlyContain(x => x.Cost > 100)

失败消息将包含所有 x 对象。

【讨论】:

以上是关于流利的断言应该大于总是通过的主要内容,如果未能解决你的问题,请参考以下文章

为啥流利的断言失败但断言通过了枚举?

流利的断言:字典应该是等效的,以排除字典值上的属性

流利的断言:Be() vs Equals()

如何使用流利的断言结合集合和属性断言?

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

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