Une manière propre de faire ceci est d'injecter VirtualTime. Cela vous permet de contrôler le temps. Installez d'abord VirtualTime
Install-Package VirtualTime
Cela permet, par exemple, de rendre le temps qui passe 5 fois plus vite sur tous les appels à DateTime.Now ou UtcNow
var DateTime = DateTime.Now.ToVirtualTime(5);
Pour ralentir le temps, par exemple 5 fois plus lentement, faites
var DateTime = DateTime.Now.ToVirtualTime(0.5);
Pour que le temps s'arrête, faites 
var DateTime = DateTime.Now.ToVirtualTime(0);
Le recul dans le temps n'est pas encore testé
Voici un exemple de test:
[TestMethod]
public void it_should_make_time_move_faster()
{
    int speedOfTimePerMs = 1000;
    int timeToPassMs = 3000;
    int expectedElapsedVirtualTime = speedOfTimePerMs * timeToPassMs;
    DateTime whenTimeStarts = DateTime.Now;
    ITime time = whenTimeStarts.ToVirtualTime(speedOfTimePerMs);
    Thread.Sleep(timeToPassMs);
    DateTime expectedTime = DateTime.Now.AddMilliseconds(expectedElapsedVirtualTime - timeToPassMs);
    DateTime virtualTime = time.Now;
    Assert.IsTrue(TestHelper.AreEqualWithinMarginOfError(expectedTime, virtualTime, MarginOfErrorMs));
}
Vous pouvez consulter plus de tests ici:
https://github.com/VirtualTime/VirtualTime/blob/master/VirtualTimeLib.Tests/when_virtual_time_is_used.cs 
L'extension DateTime.Now.ToVirtualTime vous donne une instance d'ITime que vous passez à une méthode / classe qui dépend d'ITime. certains DateTime.Now.ToVirtualTime sont configurés dans le conteneur DI de votre choix
Voici un autre exemple d'injection dans un contrôleur de classe
public class AlarmClock
{
    private ITime DateTime;
    public AlarmClock(ITime dateTime, int numberOfHours)
    {
        DateTime = dateTime;
        SetTime = DateTime.UtcNow.AddHours(numberOfHours);
        Task.Run(() =>
        {
            while (!IsAlarmOn)
            {
                IsAlarmOn = (SetTime - DateTime.UtcNow).TotalMilliseconds < 0;
            }
        });
    }
    public DateTime SetTime { get; set; }
    public bool IsAlarmOn { get; set; }
}
[TestMethod]
public void it_can_be_injected_as_a_dependency()
{
    //virtual time has to be 1000*3.75 faster to get to an hour 
    //in 1000 ms real time
    var dateTime = DateTime.Now.ToVirtualTime(1000 * 3.75);
    var numberOfHoursBeforeAlarmSounds = 1;
    var alarmClock = new AlarmClock(dateTime, numberOfHoursBeforeAlarmSounds);
    Assert.IsFalse(alarmClock.IsAlarmOn);
    System.Threading.Thread.Sleep(1000);
    Assert.IsTrue(alarmClock.IsAlarmOn);
}