5

私のコードでいくつかのベクトル操作をテストするとき、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

何が悪かったのかを理解するのが少し難しくなります。

カスタム比較関数を使用し、適切な例外を取得するにはどうすればよいですか?

4

1 に答える 1

14

答えを見つけました。NUnitEqualConstraintには、予想される名前のメソッドがあります: 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));

それはより多くのタイピングですが、それだけの価値があります。

于 2012-07-12T14:18:20.343 に答える