Level Up Coding

Coding tutorials and news. The developer homepage gitconnected.com && skilled.dev && levelup.dev

Follow publication

Bending DateTime in .NET 8 to Test Your Code Better

Stephen Walsh
Level Up Coding
Published in
4 min readNov 22, 2023

The Updated Solution

The Abstract Class

public abstract class TimeProvider
{
public DateTimeOffset GetUtcNow()
public DateTimeOffset GetLocalNow()
public long GetTimestamp()

public TimeSpan GetElapsedTime(long startingTimestamp, long endingTimestamp)
public TimeSpan GetElapsedTime(long startingTimestamp)

public long TimestampFrequency
}

The System Implementation

public abstract class TimeProvider
{
public static TimeProvider System { get; } = new SystemTimeProvider();

private sealed class SystemTimeProvider : TimeProvider
{
internal SystemTimeProvider() : base()
{
}
}
}

The Mock Implementation

public class FakeTimeProvider : TimeProvider
{
public FakeTimeProvider()
public FakeTimeProvider(DateTimeOffset startDateTime)

public DateTimeOffset Start
{ get; }
public TimeSpan AutoAdvanceAmount { get; set; }

public override DateTimeOffset GetUtcNow()

public void SetUtcNow(DateTimeOffset value)
public void Advance(TimeSpan delta)
public void SetLocalTimeZone(TimeZoneInfo localTimeZone)

public override TimeZoneInfo LocalTimeZone
public override long TimestampFrequency

public override long GetTimestamp()
public override string ToString()
}

Bending Date and Time

_ = builder.Services.AddSingleton<TimeProvider.System>();
_ = builder.Services.AddSingleton<ExampleService>();
public class ExampleService
{
private readonly TimeProvider timeProvider;

public ExampleService(TimeProvider timeProvider)
{
this.dateTimeProvider = dateTimeProvider;
}

public string GetUtcDateTimeOffset()
{
return $"UTC DateTimeOffset is{this.timeProvider.GetUTCNow()}";
}
}
public class ExampleService(TimeProvider timeProvider)
{
public string GetUtcDateTimeOffset()
{
return $"UTC DateTimeOffset is {timeProvider.GetUTCNow()}";
}

}
[Fact]
public void GetUtcDateTimeOffset_ShouldReturn_MockedUtcOffset()
{
// Arrange
var offset = TimeProvider.System.GetUTCNow().AddDays(-5);
var provider = new FakeTimeProvider(offset);
var service = new Service(provider);

// Act
var result = service.GetUtcDateTimeOffset();

// Assert
_ = result.ShouldBeOfType<string>();
result.ShouldBe($"UTC DateTimeOffset is {provider.GetUTCNow()}");
}

Where Can I Find This?

Connect or Support?

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Written by Stephen Walsh

Hello! I’m a Husband, Father, Software Engineer, Learner & Leader. I live in Wisconsin, and spend my days trying to balance all of the above.

Responses (2)

What are your thoughts?