如何用Fluent Assertions验证含字符串型数值属性的对象列表排序顺序?
用Fluent Assertions验证字符串类型数值的排序顺序
Fluent Assertions自带验证列表排序的方法:
list.Should().BeInDescendingOrder(x => x.stringProperty); list.Should().BeInAscendingOrder(x => x.stringProperty);
但如果列表中对象的排序依据是存储为字符串的数值,直接用上述方法会因为字符串的字典序比较逻辑导致断言失败。比如下面的列表:
var list = new List<MyObject> { new MyObject { stringProperty = "20" }, new MyObject { stringProperty = "100" }, new MyObject { stringProperty = "300" } // 更多对象... };
字符串比较中"100"会被认为小于"20",但实际数值上100大于20,直接断言升序会触发测试失败。
之前有人尝试把属性转换为数值存入新列表:
var numericList = list.Select(x => double.Parse(x.stringProperty)).ToList();
但这种方式无法验证原对象列表的排序正确性,我们需要直接在原列表上完成转换后的排序验证。
解决方案
方法1:在排序断言的选择器中直接转换数值
可以直接在BeInAscendingOrder或BeInDescendingOrder的属性选择器里,把字符串转换为数值类型,Fluent Assertions会基于转换后的数值进行比较:
// 验证升序 list.Should().BeInAscendingOrder(x => double.Parse(x.stringProperty)); // 验证降序 list.Should().BeInDescendingOrder(x => double.Parse(x.stringProperty));
注意:如果字符串可能存在格式错误,建议在测试前确保数据格式合法,或者使用double.TryParse配合默认值处理异常情况。
方法2:使用自定义比较器
如果需要更灵活的比较逻辑,可以创建自定义比较器,再传给断言方法的重载版本:
// 创建基于数值比较的自定义比较器 var numericComparer = Comparer<MyObject>.Create((a, b) => double.Parse(a.stringProperty).CompareTo(double.Parse(b.stringProperty))); // 用自定义比较器验证升序 list.Should().BeInAscendingOrder(numericComparer); // 用自定义比较器验证降序 list.Should().BeInDescendingOrder(numericComparer);
内容的提问来源于stack exchange,提问作者CodeObsession
相关产品推荐
相关产品推荐

