web-dev-qa-db-fra.com

NUnit Assert.AreEqual Tolérances DateTime

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 commencions à essayer de l'utiliser sur les propriétés DateTime.

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

Quelqu'un a-t-il trouvé un bon moyen de mettre en œuvre les tolérances dans ce cas? Généralement, notre solution consiste à le diviser en 2 instructions distinctes; un qui vérifie la .ToShortDateString(), et un autre qui vérifie .ToShortTimeString(), mais cela semble bâclé à mon avis.

60
Jim B

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

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

Si vous n'êtes pas sûr de la date 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);
81
SwDevMan81

Utilisez Assert.That et Is.Equal contrainte au lieu de Assert.AreEqual. Vous trouverez ci-dessous un exemple de code provenant 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);
82
Rajeesh

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é que j'ajouterais ceci comme solution car la solution acceptée était incorrecte lorsque date2 est plus grand que date1 de plus d'une seconde, et la solution n'a pas été mise à jour suite à mon commentaire à @ SwDevMan81.

10
Nathan Ernst