Абстрагирование доступа DateTime
за некоторым интерфейсом
public interface IDateTime {
DateTime UtcNow { get; }
//...other members as needed. eg: DateTime Now { get; }
}
, который можно смоделировать, чтобы он вел себя так, как хотелось бы при тестировании.
Производственная реализация будет просто оборачивать фактические DateTime
public class DefaultClock : IDateTime {
public DateTime UtcNow => DateTime.UtcNow;
//...
}
и регистрироваться в вашем контейнере DI
service.AddSingleton<IDateTime, DefaultClock>();
При тестировании абстракция может быть смоделирована как необходимо;
//Arrange
DateTime time;
DatTime.TryParse("2009-05-01 12:00:00", out time);
var mock = new Mock<IDateTime>(); //USING MOQ
mock.SetupSequence(_ => _.UtcNow)
.Returns(time); //first call
.Returns(time.AddSeconds(15)) //second call
.Returns(time.AddSeconds(30)); //third call
IDateTime clock = mock.Object;
//...inject clock into subject under test