xUnit 断言两个值相等且具有一定的容差

问题描述 投票:0回答:5

我正在尝试比较两个数字的精度与一定的容差。

这就是在 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 中执行此操作的好方法吗?

c# xunit assertion
5个回答
30
投票

您可能稍微误解了

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

7
投票

您可以使用FluentAssertions

float value = 3.1415927F;
value.Should().BeApproximately(3.14F, 0.01F);

6
投票

您可以使用

Assert.InRange()
,其中签名为

public static void InRange<T>(T actual, T low, T high) where T : IComparable

2
投票

我将一些测试从 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)
    {
    }
}

0
投票

Xunit 现在提供了一个带有容差参数的 Assert.Equal。

© www.soinside.com 2019 - 2024. All rights reserved.