【问题标题】:assert with custom comparison function使用自定义比较函数断言
【发布时间】:2012-07-12 14:17:14
【问题描述】:

在我的代码中测试一些向量运算时,我必须检查是否与某个容差值相等,因为 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

让我们更难理解出了什么问题。

我如何使用自定义比较函数并仍然得到一个不错的异常?

【问题讨论】:

    标签: c# comparison nunit


    【解决方案1】:

    找到了答案。 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));
    

    这需要更多的打字,但这是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多