without with way now fechas ejemplos convertir comparar best c# unit-testing datetime-comparison

with - datetime now c#



¿Por qué datetime no se puede comparar? (7)

mi prueba de unidad C # tiene la siguiente declaración:

Assert.AreEqual(logoutTime, log.First().Timestamp);

Por qué falla con la siguiente información:

Assert.AreEqual failed. Expected:<4/28/2010 2:30:37 PM>. Actual:<4/28/2010 2:30:37 PM>.

¿No son lo mismo?

Actualizar:

Úselo si solo le importa el segundo:

Assert.AreEqual(logoutTime.ToString(), log.First().Timestamp.ToString());


¿Estás seguro de que logoutTime y log.First (). Timestamp se escriben como DateTime?

Si es así, también podrían tener diferentes valores para la información de tiempo más específica (por ejemplo, milisegundos).


¿Has verificado que el número de tics / milisegundos es el mismo?

Si hace DateTime.Now() dos veces seguidas, parecerán ser el mismo número al minuto y probablemente incluso al segundo , pero a menudo varían según tics. Si desea verificar la igualdad solo por minuto, compare cada Fecha y hora solo hasta ese grado. Para obtener información sobre el redondeo de DateTimes, consulte here

Una nota sobre la resolución :

La propiedad Now se utiliza con frecuencia para medir el rendimiento. Sin embargo, debido a su baja resolución, no es adecuado para su uso como una herramienta de evaluación comparativa. Una mejor alternativa es usar la clase Stopwatch .


Al usar .AsNoTracking() Framework, si .AsNoTracking() de la base de datos usando .AsNoTracking() la propiedad DateTime se redondeará muy ligeramente, mientras que no necesariamente se redondeará sin .AsNoTracking() si el valor original aún está en la memoria. Por lo tanto, para las pruebas de integración que implican un viaje de ida y vuelta a la base de datos, supongo que es mejor usar .ToString() porque la base de datos reducirá ligeramente la precisión.


El método de error Assert probablemente está llamando a ToString() en DateTime, que devuelve una forma truncada y legible para humanos de la fecha sin el componente de milisegundos. Es por eso que parece que son iguales cuando, de hecho, el objeto DateTime tiene una precisión de una unidad de 100 nanosegundos (conocida como Tick ). Eso significa que es altamente improbable que dos objetos DateTime tengan exactamente el mismo valor. Para comparar, probablemente desee truncar el valor, quizás formateando la fecha con la fidelidad que necesita.


Pruebe algo como Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)


Supongo que Assert.AreEqual<T> usa Object.Equals() para determinar la igualdad de los objetos pero no los valores.

Probablemente esta afirmación está comparando dos objetos diferentes y, por lo tanto, devuelve falso.


Suponiendo que logoutTime y log.First (). Timestamp son ambos de tipo DateTime, debería intentar usar esto en su lugar:

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);