Il suffit d'encapsuler votre accès au DateTime.Now
derrière une interface.
public interface IDateTimeProvider
{
DateTime Now { get; }
}
Dans votre code, utilisez une implémentation comme celle-ci :
public class DateTimeProvider : IDateTimeProvider
{
public DateTime Now { get { return DateTime.Now; } }
}
Et pour vos tests, vous pouvez simplement simuler IDateTimeProvider
en créant une classe de test ou en utilisant un cadre de simulation.
Si vous utilisez cette interface avec une technique comme l'injection de dépendance, il est facile de modifier le comportement de votre service, même au moment de l'exécution.
Vous pouvez par exemple créer un IDateTimeProvider
qui est toujours à quelques heures près :
public class AlwaysToLateDateTimeProvider : IDateTimeProvider
{
public DateTime Now { get { return DateTime.Now.AddHours(-2); } }
}
ou créer une implémentation qui lit la date "simulée" à partir d'un fichier, d'une base de données, d'un tuyau, etc.
Lors des tests, vous configurerez votre service pour qu'il utilise l'une de ces implémentations, et lors de l'exécution en mode réel, vous configurerez simplement votre injection de dépendance pour qu'elle utilise l'implémentation ordinaire qui renvoie la "bonne" date et l'heure.
Et il y a bien sûr Isolateur TypeMock ...
Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2008, 1, 1));