gpt4 book ai didi

c# - 如何将 NUnit 的 EqualTo().Within() 约束与自定义数据类型一起使用?

转载 作者:行者123 更新时间:2023-12-01 06:22:42 24 4
gpt4 key购买 nike

我喜欢 NUnit 基于约束的 API。我经常使用这样的浮点比较:

double d = foo.SomeComputedProperty;

Assert.That(d, Is.EqualTo(42.0).Within(0.001));

很有可读性!

但是,如果我有一个自定义类,其相等性取决于浮点比较:
class Coord
{
Coord(double radius, double radians)
{
this.Radius = radius;
this.Radians = radians;
}

double Radius { get; }
double Radians { get; }

public override bool Equals(Object obj)
{
Coord c = obj as Coord;
if (obj == null || c == null) return false;

return c.Radians == this.Radians && c.Radius == this.Radius;
}
}

我想像这样编写我的测试:
Coord reference = new Coord(1.0, 3.14);

// test another Coord for near-equality to a reference Coord:
Assert.That(testCoord, Is.EqualTo(reference).Within(0.001));

是否有可能像这样使用 NUnit?

最佳答案

以下是为 NUnit 3 编写的

使用 System.Numerics.Complex类作为一个简单的例子,我可以写一个测试

Assert.That(z1, Is.EqualTo(z2).Using<Complex>(NearlyEqual));

使用此比较功能:
internal static bool NearlyEqual(Complex z1, Complex z2)
{
return Math.Abs(z1.Real - z2.Real) < 1e-10 &&
Math.Abs(z1.Imaginary - z2.Imaginary) < 1e-10;
}

这为您提供了 juharr 评论中提到的比较器,并实现了您所要求的基础知识。它不允许我参数化容差,但它很接近。

为了完成要求,我想将测试编写为
Assert.That(z1, Is.EqualTo(z2).Within(new Complex(1e-10, 1e-10)));

但是,正如问题中所述,这并不容易。它需要一种新的约束扩展方法
public static class ComplexTestExtensions
{
public static ComplexEqualConstraint WithinZ(this EqualConstraint constraint, Complex tolerance)
{
return new ComplexEqualConstraint(constraint) { Tolerance = tolerance };
}
}

然后按照以下几行编写自定义约束:
public class ComplexEqualConstraint
: EqualConstraint
{
public ComplexEqualConstraint(EqualConstraint that)
: base(that)
{
}

public override ConstraintResult ApplyTo<TActual>(TActual actual)
{
bool success = false;
if (actual is Complex z1)
{
Complex z2 = (Complex)this.Arguments[0];
success = Math.Abs(z1.Real - z1.Real) < Tolerance.Real &&
Math.Abs(z1.Imaginary - z2.Imaginary) < Tolerance.Imaginary;
}
return new ConstraintResult(this, actual, success);
}

public new Complex Tolerance
{
get;
set;
} = Complex.Zero;
}

关于c# - 如何将 NUnit 的 EqualTo().Within() 约束与自定义数据类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31752407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com