【发布时间】:2017-12-27 19:12:03
【问题描述】:
我正在尝试将两个对象列表与 FluentAssertions 进行比较。对象具有存储为双精度的属性,该属性可能有少量偏差。有没有一种有效的方法可以在不遍历列表的情况下做到这一点?我目前的方法看起来像
actualList.ShouldAllBeEquivalentTo(expectedList, options => options.Excluding(o => o.DoubleProperty));
for (var i = 0; i < actualList.Count; i++)
{
actualList[i].DoubleProperty
.Should().BeApproximately(expectedList[i].DoubleProperty, precision);
}
随着这个问题不断出现,这有点难看和烦人。另一种可能性(受Fluent Assertions: Compare two numeric collections approximately 启发)是
actualList.Select(o => o.DoubleProperty)
.Should().Equal(expectedList.Select(o => o.DoubleProperty),
(left, right) => AreEqualApproximately(left, right, precision));
我会自己编写AreEqualApproximately 函数。如果可能,我想在不定义自己的辅助方法或按索引遍历列表的情况下进行比较。
【问题讨论】:
-
它有什么难看的?我的意思是,除了没有换行符序列来分解点链之外?
-
@hoodaticus 在 C# 中,我真的不应该按索引遍历列表。代码之美是您真正需要感受的东西。
-
您需要将源数据转换为 ValueTuples 列表,其中第一项是实际列表成员,第二项是相应的预期列表成员。然后你就可以做一个 List
>.ForEach(i => i.Item1.DoubleProperty .Should().BeApproximately(i.Item2.DoubleProperty,precision));当前形式的代码需要按索引进行循环的原因是因为它必须手动关联两个单独的列表。把它们放在同一个列表中,你就很好了。 -
如果你回答我会接受。
标签: c# list unit-testing precision fluent-assertions