2015-09-24 12 views
8

Ho notato alcuni comportamenti strani in un test unitario per C#.Diversi risultati dal nuovo DateTime() e DateTime.Parse

Dato il seguente codice:

var dateTime = DateTime.Parse("01/01/2015"); 
Assert.AreEqual(dateTime, new DateTime(2015, 1, 1)); 

ottengo un test fallito con il risultato:

Expected: 2015-01-01 00:00:00.000 
But was: 01/01/2015 00:00:00 +00:00 

Ho provato a chiamare ToString() su entrambi, passando CultureInfo.CurrentCulture e impostando la DateKind sulla nuova chiamata DateTime sia a Local che a UTC ma ottengo lo stesso tipo di risultati.

Perché questi due metodi non danno lo stesso risultato?

+0

[utilizzando '==' il risultato è vero] (http://csharppad.com/gist/ba4918946a41c49b9c4c). deve essere qualcosa che non stai mostrando. – Amit

+0

Qual è il tuo 'CurrentCulture'? –

+1

Qual è il tuo framework di test, e qual è la firma di "Assert.AreEqual' - ci vogliono' Object', 'DateTime',' String' o qualcos'altro? –

risposta

1

vorrei dare un colpo con:

Assert.IsTrue(DateTime.Compare(DateTime.Parse("01/01/2015"), new DateTime(2015, 1, 1) == 0); 
+0

Anche se questo può aggirare il problema, in realtà non risponde alla domanda: _ "Perché questi due metodi non danno lo stesso risultato?" _ –

+0

Perché utilizzando AreEquals su un datetime non può usare il comparatore corretto, ma , poiché non ne sono sicuro, preferirei ottenere il feedback dell'OP per spiegare altro –

0

Non si dovrebbe mai mai hardcode date come stringa. Qual è il punto di farlo?

DateTime.Parse("01/01/2015") 

invece fare questo:

new DateTime(2015,1,1) 

DateTime.Parse sta usando la vostra cultura corrente di default per creare una data. Considera il seguente esempio:

DateTime.Parse("09/06/2015"); 

9 giugno o 6 settembre? A seconda della cultura della macchina, otterrai risultati diversi. Se la tua stringa DateTime proviene da qualche parte, puoi forzare il metodo Parse ad usare particolare formato/cultura.

Tornando alla domanda è probabilmente dipendente dalla cultura.

+4

_ "A che scopo farlo?" _ Forse il test dell'unità sta simulando l'input dell'utente in una casella di testo? –

+0

Leggi la prossima frase – MistyK

+0

@JamesThorpe - bang on. In realtà, sta tirando i valori da una tabella di database, ma per un test unitario sto simulando quel bit perché test delle unità. –

0

La domanda presuppone nell'esempio semplificato che la prima variabile sia un DateTime, quando in realtà è un DateTimeOffset. I metodi pubblici utilizzati che hanno generato quella variabile erano cambiati e presumevo in modo errato che il tipo restituito fosse ancora un DateTime.

Quindi la ragione per cui danno risultati diversi è perché sono diversi!

Lezione 1: controlla i tipi anche quando sai cosa sono. Lezione due: non semplificare troppo negli esempi di domande SO.

Problemi correlati