Pregunta

Pregunta corta, ¿por qué lo hace Assert.AreEqual(1.0, double.NaN, 1.0) ¿pasar? Mientras Assert.AreEqual(1.0, double.NaN) falla.

¿Es un error en Mstest (Microsoft.visualStudio.QualityTools.unittestframework) o me estoy perdiendo algo aquí?

Saludos cordiales, Egil.


ACTUALIZACIÓN: Probablemente debería agregar, que la razón detrás de mi pregunta es que tengo un montón de pruebas unitarias que desafortunadamente pasaron debido al resultado de que alguna operación de matriz algebraica lineal es Nan o (+/-) infinito. Las pruebas unitarias están bien, pero como afirman.

¿Fue útil?

Solución

Ten cuidado. Nan es extraño, algo así como nulo en muchos DBMS, y no debe comparar valores con él (ya sea directamente o con afirmar.areequal). De los documentos para Doble:

Use ISNAN para determinar si un valor no es un número. No es posible determinar si un valor no es un número comparándolo con otro valor igual a NAN.

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

Tendría que mirar en las partes internas de afirmar (doble, doble, doble) para ver lo que está sucediendo, pero en general, depende del comportamiento indefinido en relación con Nan.

Otros consejos

Las respuestas están desactualizadas. Si se ha solucionado el error, cuándo y en qué versiones de qué ensamblaje?

Eso es correcto, se solucionó en VS2013 con Microsoft.visualstudio.QualityTools.unittestframework.dll Ensamblaje, versión 10.0.0.0. Presente en el Legacy GAC, C: Windows Assembly, también tiene la versión 10.1.0.0.

Aquí hay una historia de DLL Hell, la versión 10.1.0.0 fue la utilizada en VS2010. Tenía el error, no verificando correctamente el doble. Microsoft cometió un error, arreglaron 10.1.0.0 pero no cambiaron el número de versión. Entonces, cualquiera que instalara VS2010 después La instalación de VS2013 se lastimará, sobrescribirá la DLL con la versión Buggy.

Desentrañar el infierno de dll nunca es tan simple, pero parece de la conectar el artículo Y por la forma en que funciona en mi máquina que identificaron el modo de falla de la queja del cliente. Y proporcionó una solución, entregada en una actualización. No está claro cuál, después de julio de 2014. Ahora usará V10.0.0.0, el corredor de prueba mstest.exe y los Qtagents tienen un archivo .config con un <bindingRedirect> Eso redirige de 10.1.0.0 a 10.0.0.0 (no un error tipográfico). Asegúrese de obtener la última actualización, actualmente 4. Busque ayuda + si no está seguro de qué actualización ha instalado.

Para el registro, el código fijo adquirió verificaciones específicas para Double.nan, se ve así:

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 utiliza la siguiente fórmula para el Assert.AreEqual<double>(expected, actual, delta) método:

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

La operación se reduce a double.NaN > delta, que devuelve verdadero en este caso. O indefinido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top