.NET 9.0 sürümü, geliştiricilerin uzun süredir ihtiyaç duyduğu birçok yenilikle birlikte geldi. Bunlardan biri de zamanla ilgili soyutlamalar yapmayı mümkün kılan TimeProvider
sınıfıdır. Özellikle birim testleri yaparken DateTime.Now
, DateTime.UtcNow
veya Task.Delay
gibi zamana bağlı işlemler hep sorun yaratmıştır. İşte bu noktada TimeProvider hayat kurtarıyor.
TimeProvider Nedir?
TimeProvider, .NET 9.0 ile gelen ve zamana bağlı işlemleri soyutlamaya yarayan bir altyapıdır. Bu yapı sayesinde;
-
Gerçek zaman (production) ile test zamanı (mock) ayrımı yapılabilir.
-
Task.Delay
gibi gecikmeler testlerde simüle edilebilir. -
Kodun zaman bağımlılığı azaltılır, daha esnek hale gelir.
TimeProvider ile Test Edilebilir Kod Yazımı
Eski Yöntemle Problemli Kod:
public class ReminderService
{
public bool IsTimeToSendReminder(DateTime reminderTime)
{
return DateTime.Now >= reminderTime;
}
}
Bu yöntemle yazılmış kodun test edilmesi zordur çünkü DateTime.Now
test sırasında sabit değildir.
Yeni Yöntem: TimeProvider ile Esnek Kod :
using System;
public class ReminderService
{
private readonly TimeProvider _timeProvider;
public ReminderService(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}
public bool IsTimeToSendReminder(DateTime reminderTime)
{
return _timeProvider.GetLocalNow().DateTime >= reminderTime;
}
}
TimeProvider ile Unit Test:
using Microsoft.Extensions.Time.Testing;
using Xunit;
public class ReminderServiceTests
{
[Fact]
public void Should_Send_Reminder_If_Time_Has_Passed()
{
var fakeTime = new FakeTimeProvider();
var now = new DateTime(2025, 1, 1, 10, 0, 0);
fakeTime.SetLocalTime(now);
var service = new ReminderService(fakeTime);
var reminderTime = now.AddMinutes(-5);
Assert.True(service.IsTimeToSendReminder(reminderTime));
}
}
Delay İşlemlerinde TimeProvider Kullanımı:
public class TaskScheduler
{
private readonly TimeProvider _timeProvider;
public TaskScheduler(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}
public async Task DoAfterDelay()
{
await _timeProvider.Delay(TimeSpan.FromSeconds(5), CancellationToken.None);
Console.WriteLine("5 saniye geçti!");
}
}
Testlerde FakeTimeProvider.Advance(TimeSpan)
metodu ile zamanı ileri alarak beklemeden test yapılabilir.
Neden Önemli?
-
Testlerde
Thread.Sleep
veyaTask.Delay
gibi gerçek beklemelere son. -
Zamana bağlı hataların kolay yakalanması.
-
Clean code ve SOLID prensiplerine daha uygun mimari.
.NET 9.0 ile birlikte gelen TimeProvider
, zamana bağlı işlemleri daha yönetilebilir ve test edilebilir hale getiriyor. Bu özellik sayesinde özellikle büyük kurumsal projelerde daha temiz, daha esnek ve daha sürdürülebilir kodlar yazmak mümkün.
Eğer .NET dünyasında test edilebilir mimari oluşturmak istiyorsanız, TimeProvider
sizin için olmazsa olmaz bir araç olacaktır.