我正在尝试比较两个数字的精度与一定的容差。
这就是在 nUnit 中检查它的方式:
Assert.That(turnOver, Is.EqualTo(turnoverExpected).Within(0.00001).Percent);
我正在尝试在 xUnit 中做同样的事情,但这就是我想到的:
double tolerance = 0.00001;
Assert.Equal(turnOver, turnoverExpected, tolerance);
这不会编译,因为
Assert.Equal
不接受类型为 double
的第三个参数。
有人知道在 xUnit 中执行此操作的好方法吗?
您可能稍微误解了
Assert.Equal(expected, actual, precision)
方法中的最后一个参数(精度)。
/// <param name="precision">The number of decimal places (valid values: 0-15)</param>
因此,例如,如果您想将
0.00021
与 0.00022
进行比较,并且您只想比较小数点后 4 位,您可以这样做(它将返回 true
):
Assert.Equal(0.00021, 0.00022, 4); // true
这将返回
false
:
Assert.Equal(0.00021, 0.00022, 5); // false
您可以使用FluentAssertions
float value = 3.1415927F;
value.Should().BeApproximately(3.14F, 0.01F);
您可以使用
Assert.InRange()
,其中签名为
public static void InRange<T>(T actual, T low, T high) where T : IComparable
我将一些测试从 MS Test V1 移植到 xUnit,并注意到带有 Delta 的
Assert
的工作方式与 xUnit 中的不同。
为了解决这个问题,我反编译了 MS Test 中的版本并制作了我自己的版本:
internal static class DoubleAssertion
{
const Double delta = 0.00001;
public static void Equal(Double expected, Double actual, String message = null)
{
if (Math.Abs(expected - actual) > delta)
{
var deltaMessage = $"Expected a difference no greater than <{delta.ToString(CultureInfo.CurrentCulture.NumberFormat)}>";
if (!String.IsNullOrWhiteSpace(message))
message = message + Environment.NewLine + deltaMessage;
else
message = deltaMessage;
throw new DoubleException(
expected: expected.ToString(CultureInfo.CurrentCulture.NumberFormat),
actual: actual.ToString(CultureInfo.CurrentCulture.NumberFormat),
message: message);
}
}
}
public class DoubleException : AssertActualExpectedException
{
public DoubleException(
String expected,
String actual,
String message)
: base(expected, actual, message)
{
}
}
Xunit 现在提供了一个带有容差参数的 Assert.Equal。