NUnit Assert.AreEqual Tolérances de date et heure

Je me demande si quelqu’un a trouvé une bonne solution à cela:

Dans nos tests unitaires nous utilisons couramment Assert.AreEqual() pour valider nos résultats. Tout va bien; jusqu’à ce que nous essayions de l’utiliser sur les propriétés DateTime.

Bien que les temps soient très similaires, ils sont parfois désactivés de quelques millisecondes, ce qui entraîne l’échec des tests. Dans notre application tant qu’ils sont exacts à la seconde; c’est assez bon pour nous.

Quelqu’un at-il trouvé un bon moyen de mettre en œuvre les tolérances dans ce cas? En règle générale, notre solution consiste à le diviser en deux instructions distinctes. un qui vérifie le .ToShortDateSsortingng() , et un autre qui vérifie .ToShortTimeSsortingng() , mais cela semble négligé à mon avis.

Vous pouvez vérifier les tolérances avec quelque chose comme:

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

Si vous ne savez pas quelle date est la plus récente, utilisez

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

NUnit a également ajouté un support intégré pour cela en utilisant le mot-clé Within

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

Utilisez les contraintes Assert.That et Is.Equal au lieu de Assert.AreEqual . Vous trouverez ci-dessous un exemple de code du site Web Nunit lui-même.

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

Pour vérifier si deux dates arbitraires sont égales à une tolérance de 1 seconde, voici une solution correcte:

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

J'ai pensé que j'appendais ceci en tant que solution car la solution acceptée était incorrecte lorsque la date2 était supérieure à la date1 de plus d'une seconde et que la solution n'avait pas été mise à jour suite à mon commentaire sur @ SwDevMan81.