为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
吃鸡游戏 2023-08-20 09:34:26
我正在尝试比较两个数字的精度和一定的容差。这是在 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 回答

?
森栏

TA贡献1810条经验 获得超5个赞

您可能稍微误解了方法中的最后一个参数(精度)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


查看完整回答
反对 回复 2023-08-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

您可以使用FluentAssertions

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


查看完整回答
反对 回复 2023-08-20
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您可以Assert.InRange()在签名所在的位置使用 ,

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


查看完整回答
反对 回复 2023-08-20
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我将一些测试从 MS Test V1 移植到 xUnit,并注意到Assert带有 Delta 的测试与 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)

    {

    }

}


查看完整回答
反对 回复 2023-08-20
  • 4 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信