Есть ли способ создать настраиваемое ограничение, при котором сначала выполняется проверка равенства 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));
}
}
}