Created
July 14, 2025 17:21
-
-
Save emonarafat/dfdd8b3df615be3725f6ae1dd55d7314 to your computer and use it in GitHub Desktop.
ITimeProvider Pattern for Testable Time Management in C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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