C# NUnit检查数组的所有值(带容差)

C# NUnit检查数组的所有值(带容差),c#,nunit,C#,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)); 除了

在努尼特,我能够做到以下几点:

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));
除了在该情况下不支持关键字中的
。是否有一种变通方法或其他方法可以轻松做到这一点?

您可以:

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.equaletto
-
equaletto
忽略顺序(
{1,2,3}
是等价的,但不等于
{2,1,3}
)。如果希望保留这种语义,最简单的解决方案是在断言之前对数组进行排序。如果要经常使用此构造,我建议您编写自己的约束。

当然,您可以使用
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
//
///验证数组是否在指定数量内
/// 
[测试]
公共无效ValidateArrayWithinValue()
{
var array1=新的双[]{0.0023d,0.011d,0.743d};
var array2=新的双[]{0.0033d,0.012d,0.742d};
Assert.That(array1,Is.EqualTo(array2).在(0.00101d)内,“Array constant失败!”);
}//ValidateArrayWithinValue

您可以设置浮点的默认公差:

GlobalSettings.DefaultFloatingPointTolerance = 0.1;
Assert.That(new[] {1.05, 2.05, 3.05}, Is.EquivalentTo(new[] {3.0, 2.0, 1.0}));

我相信Benoittr希望保留Is.equaletto的语义。您的测试不会忽略数组中项目的顺序。这就是我搜索的内容。如果它是一个单一测试的本地测试,那就更好了,但现在已经足够好了。谢谢,我不认为为所有应用程序测试设置浮点容差是个好主意,它可能会在其他测试中产生副作用。maciejkow的答案没有副作用,而且会更好(尽管他对排序的评论)。