Как добавить пользовательское равенство в NUnit, сохранив при этом проверку равенства по умолчанию - PullRequest
1 голос
/ 01 августа 2020

Есть ли способ создать настраиваемое ограничение, при котором сначала выполняется проверка равенства NUnit по умолчанию, а затем настраиваемая проверка равенства?

Например, предположим, я хочу проверить, что значения System.Double равны, но рассматривать Double.PositiveInfinity как Double.NegativeInfinity. Я могу написать простой тест Comparison в приведенном ниже коде, который проверяет этот особый случай, а затем просто использует ==.

  • Если я использую Is.EqualTo(expected).Using<double>((x, y) => Comparison(x, y));, то NaNisEqualToNaN не работает, потому что У меня нет стандартного теста на равенство NUnit.

  • Если я использую Is.EqualTo(expected).Or.EqualTo(expected).Using<double>((x, y) => Comparison(x, y)); для объединения пользовательского теста и теста по умолчанию, тогда неудачный тест, такой как ShouldFail_NegativeInfinityIsKindaEqualTo7, выдает повторяющееся сообщение об ошибке Expected: 7.0d or 7.0d But was...

Пример полного кода:

using System;
using NUnit.Framework;
using NUnit.Framework.Constraints;

namespace UnitTest
{
    [TestFixture]
    public class Class1
    {
        private Constraint IsKindaEqualTo(double expected)
        {
            // With this line, ShouldFail_NegativeInfinityIsKindaEqualTo7 reports "Expected: 7.0d or 7.0d But was:  ∞"
            return Is.EqualTo(expected).Or.EqualTo(expected).Using<double>((x, y) => Comparison(x, y));

            // With this line, the NaNisEqualToNaN test fails
            //return Is.EqualTo(expected).Using<double>((x, y) => Comparison(x, y));
        }

        private static bool Comparison(double x, double y)
        {
            if (Double.IsInfinity(x) && Double.IsInfinity(y))
            {
                return true;
            }
            else
            {
                return x == y;
            }
        }

        [Test]
        public void NegativeInfinityIsKindaEqualToPositiveInfinity()
        {
            var actual = Double.NegativeInfinity;
            var expected = Double.PositiveInfinity;

            Assert.That(actual, IsKindaEqualTo(expected));
        }

        [Test]
        public void ShouldFail_NegativeInfinityIsKindaEqualTo7()
        {
            var actual = Double.PositiveInfinity;
            var expected = 7.0;

            Assert.That(actual, IsKindaEqualTo(expected));
        }

        [Test]
        public void NaNisEqualToNaN()
        {
            var actual = Double.NaN;
            var expected = Double.NaN;

            Assert.That(actual, Is.EqualTo(expected));
        }

        [Test]
        public void NaNisKindaEqualToNan()
        {
            var actual = Double.NaN;
            var expected = Double.NaN;

            Assert.That(actual, IsKindaEqualTo(expected));
        }
    }
}

1 Ответ

1 голос
/ 02 августа 2020

Сравнение равенства NUnit происходит из класса с именем NUnitEqualityComparer. Я бы создал и использовал один из них внутри вашего метода Comparison и заключил бы все в один компаратор. например:

    private static bool Comparison(double x, double y)
    {
        var nunitComparer = new NUnitEqualityComparer();
        if (nunitComparer.AreEqual(x,y)) return true;

        if (Double.IsInfinity(x) && Double.IsInfinity(y))
        {
            return true;
        }
        else
        {
            return x == y;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...