7
votes

Pourquoi il n'y a pas d'IDATETimeProvider dans .NET et DateTime a maintenant getter?

Actuellement, j'écris actuellement un test de l'unité pour un composant qui effectue une validation spécifique de DateTime. J'ai créé IDateTimeProvider interface, qui sert d'interface denttime.utcnow interface plutôt que DateTime directement. Il semble que DateTime soit un peu surchargé et devrait être divisé en une valeur et une chose qui obtient cette valeur du système d'exploitation. Je me demande s'il y a une raison particulière de ne pas avoir de IDateTimeProvider ( ICLOCK ) interface dans .NET?


0 commentaires

4 Réponses :


7
votes

Mettez simplement: car de grandes parties de la BCL n'étaient pas conçues pour la qualification.

La même chose est vraie pour la génération de nombres aléatoires, en termes de fonctionnalité "Core" - et beaucoup de classes liées à HTTP sont bien pires pour simuler :( au moins dans ce cas, il est raisonnablement facile d'introduire votre propre horloge Interface.

sur le côté plus, lorsque Time Noda est prêt pour une utilisation de la production, il ne fournira pas seulement une API de date / heure supérieure à celle de la BCL - cela fournira un autre de test:)


0 commentaires

1
votes

Nous utilisons systématiquement une classe wrapper DateTimeProvider que nous pouvons remplacer dans un contexte de test si nécessaire ...


0 commentaires

0
votes

http://learn.typemock.com/typemock-isolator/ est capable de Mock DateTime ( et d'autres types MSCORLIB ) SO DateTime.NOW n'est plus un problème. Mais l'inconvénient est bien sûr que cela puisse mener des développeurs concevoir leur substance plus mal puisqu'il n'est pas un problème de simuler DateTime.now!

Peut-être utiliser quelque chose comme IdateTimeProvider est une meilleure solution pour de telles choses.

Mais si vous utilisez une tierce partie libère, ce relais sur ex. DateTime Typemock-isolatitrior peut-être une solution / solution de contournement.

Les moles / tampons de Microsoft Recherche sont des trucs cool: http://channel9.molesdn.com/blogs/peli/moles-replace-antan-net-method-with-a-delegate (montre comment remplacer la méthode / la propriété .NET avec un délégué - par exemple DateTime.now; -))


0 commentaires

0
votes

J'ai posté cette réponse à une autre question, mais elle s'applique aussi ici si vous recherchez un moyen simple de tester datetime.now .

Ce que j'aime faire est de créer un public Fonction qui renvoie une date d'heure ( Func ) dans la classe qui a besoin de la date / heure actuelle et de la définir pour renvoyer DateTime.now par défaut. Ensuite, pendant les tests, je l'écrase avec une fonction de test qui retourne quelle que soit la date d'heure que je veux tester. xxx


0 commentaires