21 votes

xUnit assert deux valeurs sont égales avec une certaine tolérance

J'essaie de comparer la précision de deux nombres avec une certaine tolérance.

C'est ainsi qu'il a été vérifié dans nUnit :

Assert.That(turnOver, Is.EqualTo(turnoverExpected).Within(0.00001).Percent);

J'essaie de faire la même chose dans xUnit mais c'est tout ce que j'ai trouvé :

double tolerance = 0.00001;
Assert.Equal(turnOver, turnoverExpected, tolerance);

Cela ne compile pas parce que Assert.Equal ne prend pas un 3ème argument de type double .

Quelqu'un a-t-il une idée d'une façon agréable de faire cela dans xUnit ?

23voto

OlegI Points 389

Vous avez probablement légèrement mal compris le dernier paramètre (précision) dans Assert.Equal(expected, actual, precision) méthode.

 /// <param name="precision">The number of decimal places (valid values: 0-15)</param>

Donc, par exemple, si vous voulez comparer 0.00021 con 0.00022 et que vous souhaitez comparer seulement 4 décimales, vous pouvez faire ceci (cela retournera true ):

Assert.Equal(0.00021, 0.00022, 4); // true

Cela donnera false :

Assert.Equal(0.00021, 0.00022, 5); // false

8voto

Felix Scheffer Points 56

Vous pourriez utiliser FluentAssertions

float value = 3.1415927F;
value.Should().BeApproximately(3.14F, 0.01F);

5voto

Steve Points 973

Vous pouvez utiliser Assert.InRange() où la signature est

public static void InRange<T>(T actual, T low, T high) where T : IComparable

2voto

DaveShaw Points 19555

J'ai porté quelques tests de MS Test V1 vers xUnit et j'ai remarqué que la fonction Assert avec un Delta ne fonctionnait pas de la même manière que celui de xUnit.

Pour résoudre ce problème, j'ai décompilé celui de MS Test et créé ma propre version :

internal static class DoubleAssertion
{
    const Double delta = 0.00001;

    public static void Equal(Double expected, Double actual, String message = null)
    {
        if (Math.Abs(expected - actual) > delta)
        {
            var deltaMessage = $"Expected a difference no greater than <{delta.ToString(CultureInfo.CurrentCulture.NumberFormat)}>";

            if (!String.IsNullOrWhiteSpace(message))
                message = message + Environment.NewLine + deltaMessage;
            else
                message = deltaMessage;

            throw new DoubleException(
                expected: expected.ToString(CultureInfo.CurrentCulture.NumberFormat),
                actual: actual.ToString(CultureInfo.CurrentCulture.NumberFormat),
                message: message);
        }
    }
}

public class DoubleException : AssertActualExpectedException
{
    public DoubleException(
        String expected,
        String actual,
        String message)
        : base(expected, actual, message)
    {
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X