NUnit Assert.AreEqual DateTime Tolerancias


Me pregunto si alguien ha encontrado una buena solución a esto:

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

Aunque los tiempos son muy similares, a veces están apagados en milisegundos, lo que hace que las pruebas fallen. En nuestra aplicación; siempre y cuando sean precisos al segundo; eso es suficiente para nosotros.

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

Author: Jim B, 2010-08-26

3 answers

Puedes comprobar las tolerancias con algo como:

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

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

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);
 74
Author: SwDevMan81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 11:50:26

Use Assert.Que y Es.Igual restricción, en lugar de Valer.AreEqual . A continuación se muestra un ejemplo de código del propio 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);
 79
Author: Rajeesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 11:52:35

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

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

Pensé en agregar esto 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 la solución no se ha actualizado después de mi comentario a @SwDevMan81.

 9
Author: Nathan Ernst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 22:45:39