在NUnit中,我可以执行以下操作:
Assert.That(1.05,Is.EqualTo(1.0).Within(0.1));
我也能做到:
Assert.That(new[]{1.0,2.0,3.0},Is.EquivalentTo(new[]{3.0,2.0,1.0}));
现在我想沿着这条线做点什么
Assert.That(new[]{1.05,2.05,3.05},
Is.EquivalentTo(new[]{3.0,2.0,1.0}).Within(0.1));
在这种情况下,不支持Within
关键字。是否有解决方法或其他方法可以轻松实现?
答案 0 :(得分:11)
您可以设置浮点的默认容差:
GlobalSettings.DefaultFloatingPointTolerance = 0.1;
Assert.That(new[] {1.05, 2.05, 3.05}, Is.EquivalentTo(new[] {3.0, 2.0, 1.0}));
答案 1 :(得分:7)
你可以这样做:
var actual = new[] {1.05, 2.05, 3.05};
var expected = new[] { 1, 2, 3 };
Assert.That(actual, Is.EqualTo(expected).Within(0.1));
但是,Is.EqualTo
语义与Is.EquivalentTo
略有不同 - EquivalentTo
忽略顺序({1, 2, 3}
等效,但不等于{2, 1, 3}
)。如果您想保留这种语义,最简单的解决方案是在断言之前对数组进行排序。如果您打算使用这个构造很多,我建议您为此编写自己的约束。
答案 2 :(得分:1)
当然,您可以使用EqualTo
检查数组值。像这样:
/// <summary>
/// Validate the array is within a specified amount
/// </summary>
[Test]
public void ValidateArrayWithinValue()
{
var array1 = new double[] { 0.0023d, 0.011d, 0.743d };
var array2 = new double[] { 0.0033d, 0.012d, 0.742d };
Assert.That(array1, Is.EqualTo(array2).Within(0.00101d), "Array Failed Constaint!");
} // ValidateArrayWithinValue