Fluent Assertion集合断言异常:条件变更仍始终通过的问题求助
问题根源:LINQ延迟执行导致断言根本没运行
嗨,你遇到的这个“假通过”问题,核心是LINQ的延迟执行特性在搞鬼!你用Select来写断言的时候,Select本身只是创建了一个待执行的查询,并没有真的去遍历集合里的元素。也就是说,那些x.Cost.Should().BeGreaterThan(...)的断言代码,根本就没被执行过——测试当然会随便通过啦!
正确的验证方式(三种方案任选)
要确保集合里所有元素都满足Cost的条件,这几种方法才靠谱:
1. 用All配合断言(简洁但错误提示模糊)
先通过All判断所有元素是否符合条件,再对结果做断言:
var costByFactory = dataAccess.GetcostPerFactoryt(null, null); costByFactory.Should().NotBeEmpty(); // 比Count().Should().BeGreaterThan(0)更语义化 // 验证所有Cost都大于100 costByFactory.All(x => x.Cost > 100).Should().BeTrue();
缺点是如果断言失败,只会告诉你“不是所有元素都符合要求”,没法直接看到是哪个元素出了问题。
2. 遍历集合逐个断言(错误提示清晰)
直接循环每个元素做断言,这样一旦有元素不符合条件,测试框架会明确告诉你具体是哪个元素的Cost不达标:
var costByFactory = dataAccess.GetcostPerFactoryt(null, null); costByFactory.Should().NotBeEmpty(); foreach (var item in costByFactory) { item.Cost.Should().BeGreaterThan(100); }
3. 用FluentAssertions的AllSatisfy(最优雅)
既然你已经在使用FluentAssertions,它专门提供了AllSatisfy方法来验证集合所有元素的条件,不仅语义化,错误提示还特别友好:
var costByFactory = dataAccess.GetcostPerFactoryt(null, null); costByFactory.Should().NotBeEmpty() .And.AllSatisfy(item => { item.Cost.Should().BeGreaterThan(100); });
要是断言失败,它会直接告诉你哪个元素的Cost是多少,为什么不符合条件,排查问题超方便。
小提醒
以后用LINQ的时候要注意:像Select、Where这类延迟执行的方法,只有在触发枚举(比如ToList()、Count()、foreach遍历)的时候,才会真正执行里面的代码。你之前的代码没触发Select的执行,所以断言等于白写啦!
内容的提问来源于stack exchange,提问作者Simsons
相关产品推荐
相关产品推荐

