ऐसा करने का एक साफ तरीका है वर्चुअरमेट को इंजेक्ट करना। यह आपको समय को नियंत्रित करने की अनुमति देता है। पहले VirtualTime स्थापित करें
Install-Package VirtualTime
उदाहरण के लिए, DateTime.Now या UtcNow के लिए सभी कॉल पर 5 गुना तेजी से आगे बढ़ने के लिए अनुमति देता है
var DateTime = DateTime.Now.ToVirtualTime(5);
समय को धीमा करने के लिए, जैसे 5 बार धीमी गति से करें
var DateTime = DateTime.Now.ToVirtualTime(0.5);
टाइम स्टैंड बनाने के लिए अभी भी करते हैं
var DateTime = DateTime.Now.ToVirtualTime(0);
समय में पीछे की ओर बढ़ना अभी तक परीक्षण नहीं किया गया है
यहाँ एक नमूना परीक्षण कर रहे हैं:
[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));
}
आप यहां और परीक्षण देख सकते हैं:
https://github.com/VirtualTime/VirtualTime/blob/master/VirtualTimeLib.Tests/when_virtual_time_is_used.cs
क्या DateTime.Now.ToVirtualTime एक्सटेंशन आपको आईटीआई का एक उदाहरण देता है, जिसे आप एक विधि / कक्षा में पास करते हैं जो आईटीईएम पर निर्भर करता है। कुछ DateTime.Now.ToVirtualTime अपनी पसंद के DI कंटेनर में सेटअप है
यहाँ एक और उदाहरण एक वर्ग के अविश्वास में इंजेक्शन है
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);
}