58 votes

NUnit Assert.AreEqual Tolérances DateTime

Je me demandais si quelqu'un a trouvé une bonne solution pour cela:

Dans nos tests unitaires; nous utilisons couramment Assert.AreEqual() afin de valider nos résultats. Tout est bien et bon; jusqu'à ce que nous commencer à essayer de l'utiliser sur DateTime propriétés.

Même si les temps sont très similaires, parfois, ils sont désactivés par millisecondes, ce qui provoque l'échec des tests. Dans notre application; tant qu'ils sont précis à la seconde; c'est assez bon pour nous.

Personne n'a trouvé un bon moyen de faire en quelque sorte de mettre en œuvre des tolérances dans ce cas? Typiquement, la solution de contournement consiste à le diviser en 2 états distincts; l'un qui vérifie l' .ToShortDateString(), et un autre qui vérifie .ToShortTimeString(), mais cela semble bâclée à mon avis.

88voto

Rajeesh Points 1418

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

 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;
 

85voto

SwDevMan81 Points 22634

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 à l'aide du 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;
 

10voto

Nathan Ernst Points 3079

Pour vérifier correctement si 2 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é ajouter cette solution en tant que solution car la solution acceptée était incorrecte lorsque date2 est supérieur à date1 de plus d'une seconde et que la solution n'a pas été mise à jour à la suite de mon commentaire. @ SwDevMan81.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X