xUnit断言两个值相等并具有一定的公差

21

我试图比较两个数的精度,并加上一些容差。

以下是在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中如何优雅地解决这个问题吗?

4个回答

23

你可能稍微误解了Assert.Equal(expected, actual, precision)方法中的最后一个参数(precision)。

 /// <param name="precision">The number of decimal places (valid values: 0-15)</param>

例如,如果您想将0.000210.00022进行比较,并且只对比较4个小数位感兴趣,您可以这样做(它将返回true):

Assert.Equal(0.00021, 0.00022, 4); // true

这将返回false

Assert.Equal(0.00021, 0.00022, 5); // false

那样更有意义,我会尝试一下。 - nick gowdy
我认为这是一个合理的答案。 - Pablo Adames
1
那不起作用!如果期望结果非常接近舍入点,则可能会有非常小的差异,例如1e-10,但对于精度为1而言则失败!(示例:期望值=0.35,实际值=0.3499999999,但如果四舍五入0.4 != 0.3) - LionAM

8
你可以使用 FluentAssertions
float value = 3.1415927F;
value.Should().BeApproximately(3.14F, 0.01F);

5
你可以使用Assert.InRange(),其签名为:
public static void InRange<T>(T actual, T low, T high) where T : IComparable

这就是我要找的,因为在我的情况下,公差必须是+-4,而小数位过于精确。 - PetoMPP

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)
    {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接