Question

petite question, pourquoi Assert.AreEqual(1.0, double.NaN, 1.0) passe? Alors ne Assert.AreEqual(1.0, double.NaN).

Est-ce un bogue dans MSTest (Microsoft.VisualStudio.QualityTools.UnitTestFramework) ou suis-je manque quelque chose ici?

Cordialement, Egil.


Mise à jour: Faut-il ajouter probablement, que la raison de ma question est, que j'ai un tas de tests unitaires qui, malheureusement, sont passés en raison du résultat d'une opération matricielle algébrique linéaire étant NaN ou (+/-) Infinity. Les tests unitaires sont très bien, mais depuis le Assert.AreEqual double avec un delta passeront quand même et / ou attendus sont NaN ou Infinity, je suis resté à croire que le code que je testais était correct.

Était-ce utile?

La solution

Faites attention. NaN est bizarre, un peu comme nulle dans de nombreux DBMS, et vous ne devriez pas être la comparaison des valeurs à elle (soit directement, soit avec Assert.AreEqual). De la documentation Double.NaN :

  

Utilisation IsNaN pour déterminer si une valeur   est pas un numéro. Il est impossible de   déterminer si une valeur est pas   nombre en le comparant à un autre   valeur égale à NaN.

double zero = 0;
Console.WriteLine((0 / zero) == Double.NaN);  // prints false
Console.WriteLine(Double.IsNaN(0 / zero));  // prints true

Il faudrait scruter les entrailles de assert (doubles, double, double) pour voir ce qui se passe, mais en général, vous êtes en fonction du comportement non défini par rapport à NaN.

Autres conseils

  

Les réponses sont obsolètes. Si le bug a été corrigé, quand et dans quelles versions de ce montage?

C'est exact, il a été fixé à VS2013 avec l'ensemble Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, la version 10.0.0.0. Présent dans l'héritage GAC, c: \ windows \ montage, il a également la version 10.1.0.0

.

Il y a une histoire DLL enfer ici, la version 10.1.0.0 était celle utilisée dans VS2010. Il a eu le bug, ne vérifie pas correctement pour Double.NaN. Microsoft a fait une erreur, ils ont fixé 10.1.0.0, mais n'a pas changé le numéro de version. Donc, quelqu'un qui est installé VS2010 après l'installation VS2013 va se blesser, il va remplacer la DLL avec la version buggy.

Unraveling l'enfer des DLL est jamais aussi simple que cela, mais il ressort de la

MSTest utilise la formule suivante pour la méthode de Assert.AreEqual<double>(expected, actual, delta):

if (Math.Abs(expected - actual) > delta)
    Assert.HandleFail("Assert.AreEqual", ...)

L'opération se réduit à double.NaN > delta, qui retourne vrai dans ce cas. Ou non définie.

scroll top