【问题标题】:How to add custom equality to NUnit while also keeping the default equality check如何在保持默认相等检查的同时向 NUnit 添加自定义相等
【发布时间】:2020-08-01 10:09:35
【问题描述】:

有没有办法进行自定义约束,先完成 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));
        }
    }
}

【问题讨论】:

    标签: c# unit-testing nunit nunit-3.0


    【解决方案1】:

    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;
            }
        }
    

    【讨论】:

    • 其他想法 - 我也很想将您的 IsKindaEqualTo 方法转换为 Custom Constraint。但是,这超出了您的要求。 =)
    • 谢谢!此外,相等性测试适用于包装 NUnit 的库,因此实际上并不需要符合通常的 NUnit API。
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多