2010-08-26 1 views
44

Mi chiedo se qualcuno ha trovato una buona soluzione a questo:NUnit Assert.AreEqual DateTime tolleranze

Nei nostri test di unità; comunemente usiamo Assert.AreEqual() per convalidare i nostri risultati. Tutto va bene e bene; fino a quando non iniziamo a provare a utilizzarlo su proprietà DateTime.

Sebbene i tempi siano molto simili, a volte sono scaduti di millisecondi, il che causa il fallimento dei test. Nella nostra applicazione; finché sono precisi al secondo; questo è abbastanza buono per noi.

Qualcuno ha trovato un buon modo per implementare in qualche modo le tolleranze in questo caso? In genere, la nostra soluzione è dividerla in 2 istruzioni separate; uno che controlla il .ToShortDateString(), e un altro che controlla .ToShortTimeString(), ma questo sembra sciatto a mio parere.

risposta

66

È possibile controllare le tolleranze con qualcosa di simile:

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

Se non siete sicuri che la data è più recente, utilizzare

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

NUnit ha anche aggiunto un supporto incorporato per questo utilizzando la Within parola chiave

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); 
+0

Molto bello. Non ho mai pensato di implementarlo in questo modo –

+0

Ma non intendi davvero '<'? –

+0

@Dan Tao - Sì, il mio modo di pensare era arretrato, sì, se lo vuoi, allora dovrebbe < – SwDevMan81

9

Per verificare correttamente se 2 date arbitrarie sono uguali a in un secondo di tolleranza 1, la seguente è una soluzione corretta:

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

ho pensato che vorrei aggiungere questo come una soluzione in quanto la soluzione accettata era corretta quando date2 è più grande di date1 di più di un secondo, e il la soluzione non è stata aggiornata seguendo il mio commento a @ SwDevMan81.

73

Usa Assert.That e Is.Equal vincolo anziché Assert.AreEqual. Di seguito è riportato un esempio di codice dal sito Web Nunit stesso

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); 
+0

Risposta eccellente! Grazie! – jrista

+0

Soluzione molto più pulita. Se questa Assert fallisce, il messaggio prodotto indicherà chiaramente la causa dell'errore. – GuiSim

+1

IMHO risposta molto meglio di quella accettata! – AFract