استفاده از TimeProvider داتنت 8 برای تست کدنویسی وابسته به زمان
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۱۱ ۰۹:۲۱
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public interface ITimeService
{
DateTime GetCurrentTime();
}
public class SystemTimeService : ITimeService
{
public DateTime GetCurrentTime() => DateTime.Now;
}
public class MyService
{
private readonly ITimeService _timeService;
public MyService(ITimeService timeService)
{
_timeService = timeService;
}
public string GetGreeting()
{
var hour = _timeService.GetCurrentTime().Hour;
return hour < 12 ? "صبح بخیر" : "عصر بخیر";
}
}public abstract class TimeProvider
{
public static TimeProvider System { get; }
public virtual DateTimeOffset GetUtcNow();
public DateTimeOffset GetLocalNow();
public virtual TimeZoneInfo LocalTimeZone { get; }
public virtual ITimer CreateTimer(TimerCallback callback, object? state, TimeSpan dueTime, TimeSpan period);
}public class GreetingService
{
private readonly TimeProvider _timeProvider;
public GreetingService(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}
public string GetGreeting()
{
var hour = _timeProvider.GetLocalNow().Hour;
return hour < 12 ? "صبح بخیر" : "عصر بخیر";
}
}public class GreetingServiceTests
{
[Fact]
public void GetGreeting_Morning_ReturnsMorningGreeting()
{
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetUtcNow(new DateTime(2025, 3, 31, 8, 0, 0, DateTimeKind.Utc)); // 8 صبح UTC
fakeTimeProvider.SetLocalTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Iran Standard Time"));
var service = new GreetingService(fakeTimeProvider);
var result = service.GetGreeting();
Assert.Equal("صبح بخیر", result);
}
[Fact]
public void GetGreeting_Afternoon_ReturnsAfternoonGreeting()
{
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetUtcNow(new DateTime(2025, 3, 31, 14, 0, 0, DateTimeKind.Utc)); // 2 بعدازظهر UTC
fakeTimeProvider.SetLocalTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Iran Standard Time"));
var service = new GreetingService(fakeTimeProvider);
var result = service.GetGreeting();
Assert.Equal("عصر بخیر", result);
}
}public class TimerService
{
private readonly TimeProvider _timeProvider;
public bool HasTimerTriggered { get; private set; }
public TimerService(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
_timeProvider.CreateTimer(_ => HasTimerTriggered = true, null, TimeSpan.FromSeconds(5), Timeout.InfiniteTimeSpan);
}
}
public class TimerServiceTests
{
[Fact]
public void Timer_TriggersAfter5Seconds()
{
var fakeTimeProvider = new FakeTimeProvider();
var startTime = new DateTime(2025, 3, 31, 10, 0, 0);
fakeTimeProvider.SetUtcNow(startTime);
var service = new TimerService(fakeTimeProvider);
Assert.False(service.HasTimerTriggered);
fakeTimeProvider.SetUtcNow(startTime.AddSeconds(6));
Assert.True(service.HasTimerTriggered);
}
}