tutorial español descargar unit-testing datetime .net-3.5 nunit

unit testing - español - ¿Por qué falla esta prueba de unidad cuando se prueba la igualdad de DateTime?



phpunit tutorial (5)

El problema no es realmente TryParse, sino realmente ToString ().

Un objeto DateTime comienza con precisión (si no es preciso) hasta una millonésima de segundos. ToString () lo convierte en una cadena, con precisión solo en un segundo.

TryParse está haciendo lo mejor que puede con lo que se le da.

Si agrega un especificador de formato (en la línea de "yyyy-MM-dd HH:mm:ss.ffffff" ), debería funcionar.

Usando NUnit 2.2 en .NET 3.5, la siguiente prueba falla al usar DateTime.Equals. ¿Por qué?

[TestFixture] public class AttributeValueModelTest { public class HasDate { public DateTime? DateValue { get { DateTime value; return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); } } public object ObjectValue { get; set; } } [Test] public void TwoDates() { DateTime actual = DateTime.Now; var date = new HasDate {ObjectValue = actual}; Assert.IsTrue(date.DateValue.Value.Equals(actual)); } }


Para especificar un formato que incluya toda la precisión, puede usar el método String.Format (). El ejemplo que da James se vería así:

String.Format("{0:yyyy-MM-dd HH:mm:ss.ffffff}", ObjectValue);

No sé lo que hará cuando le pase algo que no sea una cita.

Tal vez un enfoque más simple es agregar un caso especial cuando ya tienes un objeto de fecha:

public DateTime? DateValue { get { DateTime value = ObjectValue as DateTime; if (value != null) return value; return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); } }


Las fechas no son iguales. TryParse deja caer algunas marcas. Compare los valores de Tick.

Para una ejecución de prueba:

Console.WriteLine(date.DateValue.Value.Ticks); Console.WriteLine(actual.Ticks);

Rendimientos:

633646934930000000 633646934936763185


No sé si esto es lo mismo en .NET, pero en Java, los iguales a menudo solo se compararán si las instancias son las mismas, no si los valores son los mismos. En cambio, querrías usar compareTo.


public DateTime? DateValue { get { DateTime value; bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value); return isDate ? new DateTime?(value) : new DateTime?(); } }