2010-08-26 15 views
44

Me pregunto si alguien ha encontrado una buena solución para esto:NUnit Assert.AreEqual DateTime tolerancias

En nuestras pruebas unitarias; comúnmente usamos Assert.AreEqual() para validar nuestros resultados. Todo está bien y bien; hasta que comencemos a tratar de usar esto en las propiedades de DateTime.

Aunque los tiempos son muy similares, a veces se desactivan en milisegundos, lo que hace que las pruebas fallen. En nuestra aplicación; siempre que sean precisos al segundo; eso es lo suficientemente bueno para nosotros.

¿Alguien ha encontrado una buena manera de implementar de alguna manera las tolerancias en este caso? Por lo general, nuestra solución es dividirla en 2 declaraciones separadas; uno que comprueba el .ToShortDateString(), y otro que comprueba .ToShortTimeString(), pero parece descuidado en mi opinión.

Respuesta

66

Puede comprobar las tolerancias con algo como:

Debug.Assert((date1 - date2) < TimeSpan.FromSeconds(1)); 

Si no está seguro de qué fecha es más reciente, utiliza

Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1) 

NUnit también ha añadido soporte incorporado para esto usando el Within palabra clave

DateTime now = DateTime.Now; 
DateTime later = now + TimeSpan.FromHours(1.0); 

Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0))); 
Assert.That(later, Is.EqualTo(now).Within(3).Hours); 
+0

Muy bonito. Nunca pensé en implementarlo de esta manera –

+0

¿Pero no te refieres a '<'? –

+0

@Dan Tao - Sí, mi pensamiento de afirmación fue al revés, sí, si lo quiere es un error, entonces debería < – SwDevMan81

9

Para verificar correctamente si 2 fechas arbitrarias son iguales a dentro de una segunda tolerancia 1, la siguiente es una solución correcta:

Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1) 

pensé que había que añadir como una solución ya que la solución aceptada era incorrecta cuando date2 es mayor que date1 por más de un segundo, y el la solución no se ha actualizado siguiendo mi comentario a @ SwDevMan81.

73

Uso Assert.That y Is.Equal restricción en lugar de Assert.AreEqual. A continuación se muestra un ejemplo de código del sitio web de Nunit

DateTime now = DateTime.Now; 
DateTime later = now + TimeSpan.FromHours(1.0); 

Assert.That(now, Is.EqualTo(now)); 
Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0))); 
Assert.That(later, Is.EqualTo(now).Within(3).Hours); 
+0

¡Excelente respuesta! ¡Gracias! – jrista

+0

Solución mucho más limpia. Si este Assert falla, el mensaje producido indicará claramente la causa de la falla. – GuiSim

+1

En mi humilde opinión mejor respuesta que la aceptada! – AFract