2010-04-28 17 views
35

mi prueba # unidad C tiene la siguiente declaración:¿Por qué datetime no se puede comparar?

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

¿Por qué se ha fallado con el 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?

Actualización:

Uso esto si sólo se preocupan al segundo:

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

+12

¿Estás seguro de que los dos valores son iguales? Tal vez las partes de milisegundo son diferentes? – dtb

+1

Revisa http://stackoverflow.com/questions/364055/why-does-this-unit-test-fail-when-testing-datetime-equality aparentemente, mientras que las fechas son iguales, eso no significa que sean iguales a la garrapata. – Rangoric

Respuesta

41

¿Ha verificado que el número de garrapatas/milisegundos son iguales?

Si lo hace dos veces DateTime.Now() espalda con espalda, que aparecerá a ser el mismo número hasta el último minuto y probablemente incluso hasta el segundo, pero a menudo pueden variar por las garrapatas. Si desea verificar la igualdad solo por minuto, compare cada Fecha y hora solo hasta ese grado. Para obtener información sobre DateTime de redondeo, ver here


A note about resolution:

La propiedad Ahora 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.

1

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

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

0

intentar algo así como Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)

+0

Como dice Jon Skeet en la respuesta de jlech: "Eso hará exactamente lo mismo, aparte de mostrar los diferentes valores de los tics en el mensaje de excepción". – Dinah

+0

Exactamente, por lo que le mostrará por qué los dos valores no son iguales. – Germ

0

supongo Assert.AreEqual<T> utiliza 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. .

0

Suponiendo que logoutTime y log.First() Marca de tiempo son ambos de tipo DateTime, usted debe tratar de usar esto en su lugar:

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

Eso hará exactamente lo mismo, aparte de mostrar los diferentes valores de tics en el mensaje de excepción. –

3

la aserción falle método es probablemente llamando ToString() en el DateTime que devuelve un truncada , forma legible por 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.

1

Usando marco de la entidad, si usted lo trae desde la base de datos utilizando la propiedad .AsNoTracking()DateTime se redondeará muy ligeramente, mientras que no necesariamente va a ser redondeada y sin .AsNoTracking() si el valor original se encuentra todavía 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.

Cuestiones relacionadas