在我的代码中测试某些矢量运算时,我必须检查是否与某些公差值相等,因为 float
值可能不完全匹配。
这意味着我的测试断言是这样的:
Assert.That(somevector.EqualWithinTolerance(new Vec3(0f, 1f, 0f)), Is.True);
取而代之的是:
Assert.That(somevector, Is.EqualTo(new Vec3(0f, 1f, 0f)));
这意味着我的异常是这样的:
Expected: True
But was: False
取而代之的是:
Expected: 0 1 0
But was: 1 0 9,536743E-07
稍微难以理解哪里出了问题。
我如何使用自定义比较函数并仍然得到一个不错的异常?
最佳答案
找到了答案。 NUnit EqualConstraint
有一个具有预期名称的方法:Using
。
所以我刚刚添加了这个类:
/// <summary>
/// Equality comparer with a tolerance equivalent to using the 'EqualWithTolerance' method
///
/// Note: since it's pretty much impossible to have working hash codes
/// for a "fuzzy" comparer the GetHashCode method throws an exception.
/// </summary>
public class EqualityComparerWithTolerance : IEqualityComparer<Vec3>
{
private float tolerance;
public EqualityComparerWithTolerance(float tolerance = MathFunctions.Epsilon)
{
this.tolerance = tolerance;
}
public bool Equals(Vec3 v1, Vec3 v2)
{
return v1.EqualWithinTolerance(v2, tolerance);
}
public int GetHashCode(Vec3 obj)
{
throw new NotImplementedException();
}
}
我实例化了它并像这样使用它:
Assert.That(somevector, Is.EqualTo(new Vec3(0f, 1f, 0f)).Using(fuzzyVectorComparer));
需要更多的输入,但这是值得的。
关于c# - 使用自定义比较函数断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453846/