Một cách rõ ràng để làm điều này là tiêm VirtualTime. Nó cho phép bạn kiểm soát thời gian. Lần đầu tiên cài đặt VirtualTime
Install-Package VirtualTime
Điều đó cho phép, ví dụ, tạo thời gian di chuyển nhanh hơn 5 lần trên tất cả các cuộc gọi đến DateTime. Bây giờ hoặc UtcNow
var DateTime = DateTime.Now.ToVirtualTime(5);
Để làm cho thời gian di chuyển chậm hơn, ví dụ chậm hơn 5 lần
var DateTime = DateTime.Now.ToVirtualTime(0.5);
Để thời gian đứng yên
var DateTime = DateTime.Now.ToVirtualTime(0);
Di chuyển ngược thời gian chưa được thử nghiệm
Dưới đây là một bài kiểm tra mẫu:
[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));
}
Bạn có thể kiểm tra thêm các bài kiểm tra ở đây:
https://github.com/VirtualTime/VirtualTime/blob/master/VirtualTimeLib.Tests/when_virtual_time_is_use.cs
Phần mở rộng DateTime.Now.ToVirtualTime cung cấp cho bạn là một phiên bản của ITime mà bạn chuyển đến một phương thức / lớp phụ thuộc vào ITime. một số DateTime.Now.ToVirtualTime được thiết lập trong bộ chứa DI bạn chọn
Dưới đây là một ví dụ khác về tiêm thuốc vào lớp
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);
}