Frage

Kurze Frage, warum tut es? Assert.AreEqual(1.0, double.NaN, 1.0) passieren? Wohingegen Assert.AreEqual(1.0, double.NaN) scheitert.

Ist es ein Fehler in MStest (Microsoft.visualstudio.QualityTools.unittestframework) oder fehlt mir hier etwas?

Mit freundlichen Grüßen, Egil.


UPDATE: Sollte wahrscheinlich hinzufügen, dass der Grund für meine Frage ist, dass ich eine Reihe von Unit-Tests habe, die aufgrund des Ergebniss einer linearen algebraischen Matrixoperation leider NAN- oder (+/-) Unendlichkeit bestehen. Die Unit -Tests sind in Ordnung, aber seit geltend.

War es hilfreich?

Lösung

Vorsichtig sein. Nan ist seltsam, ähnlich wie Null in vielen DBMS, und Sie sollten keine Werte damit vergleichen (entweder direkt oder mit Assert.Areequal). Von den Dokumenten für Double.nan:

Verwenden Sie ISNAN, um festzustellen, ob ein Wert keine Zahl ist. Es ist nicht möglich zu bestimmen, ob ein Wert keine Zahl ist, indem er ihn mit einem anderen Wert vergleicht, der der NAN entspricht.

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

Sie müssten bei den Interna von Assert (doppelt, doppelt, doppelt) schauen, um zu sehen, was vor sich geht, aber im Allgemeinen sind Sie im Vergleich zu NAN abhängig vom undefinierten Verhalten.

Andere Tipps

Die Antworten sind veraltet. Wenn der Fehler repariert wurde, wann und in welchen Versionen von welcher Versammlung?

Das ist richtig, es wurde in VS2013 mit Microsoft.visualstudio.QualityTools.unittestframework.dll Assembly, Version 10.0.0.0 behoben. In der Legacy GAC, C: Windows Assembly, verfügt sie auch über die Version 10.1.0.0.

Hier gibt es eine DLL Hell -Geschichte, die Version 10.1.0.0 war die in VS2010 verwendete. Es hatte den Fehler, nicht ordnungsgemäß nach Double.nan. Microsoft machte einen Fehler, sie haben 10.1.0.0 behoben, die Versionsnummer jedoch nicht geändert. Also jeder, der VS2010 installiert hat nach Die Installation von VS2013 wird verletzt, es wird die DLL mit der fehlerhaften Version überschreiben.

Dll Hölle auflösen ist nie so einfach, aber es erscheint aus dem Artikel verbinden und von der Art und Weise, wie es auf meiner Maschine funktioniert, haben sie den Fehlermodus aus der Beschwerde des Kunden identifiziert. Und lieferte eine Lösung, die in einem Update geliefert wurde. Nicht klar, welches nach Juli 2014. Sie jetzt v10.0.0.0 verwenden, den Testläufer mstest.exe und die QTagents haben eine .config -Datei mit einem <bindingRedirect> Das leitet von 10.1.0.0 bis 10.0.0.0 (kein Tippfehler) aus. Achten Sie darauf, dass Sie das neueste Update erhalten. Derzeit 4. Sehen Sie sich in der Hilfe + nach, wenn Sie nicht sicher sind, welches Update Sie installiert haben.

Für den Datensatz wurde der feste Code spezifische Schecks für double.nan erfasst. Es sieht so aus:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters)
{
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta))
    {
        string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str, parameters);
    }
    if (Math.Abs((double) (expected - actual)) > delta)
    {
        string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str2, parameters);
    }
}

MSTEST verwendet die folgende Formel für die Assert.AreEqual<double>(expected, actual, delta) Methode:

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

Der Betrieb reduziert sich auf double.NaN > delta, was in diesem Fall wahr zurückgibt. Oder undefiniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top