Skip to content

Instantly share code, notes, and snippets.

@emonarafat
Created July 14, 2025 17:21
Show Gist options
  • Save emonarafat/dfdd8b3df615be3725f6ae1dd55d7314 to your computer and use it in GitHub Desktop.
Save emonarafat/dfdd8b3df615be3725f6ae1dd55d7314 to your computer and use it in GitHub Desktop.
ITimeProvider Pattern for Testable Time Management in C#
// ITimeProvider.cs
public interface ITimeProvider
{
DateTime UtcNow { get; }
}
// SystemTimeProvider.cs
public class SystemTimeProvider : ITimeProvider
{
public DateTime UtcNow => DateTime.UtcNow;
}
// FakeTimeProvider.cs
public class FakeTimeProvider : ITimeProvider
{
public DateTime UtcNow { get; set; } = DateTime.UtcNow;
}
// TokenService.cs
public class TokenService
{
private readonly ITimeProvider _clock;
public TokenService(ITimeProvider clock)
{
_clock = clock;
}
public bool IsExpired(DateTime expiry)
{
return _clock.UtcNow > expiry;
}
}
// Program.cs - DI Setup
builder.Services.AddSingleton<ITimeProvider, SystemTimeProvider>();
// Example test
[Fact]
public void Token_ShouldBeExpired_WhenTimePasses()
{
var clock = new FakeTimeProvider { UtcNow = new DateTime(2025, 1, 1) };
var service = new TokenService(clock);
Assert.True(service.IsExpired(new DateTime(2024, 12, 31)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment