Simple library to help abstracting time in dotnet projects, usually for testing purpose.
Contains:
- An
IDateTimeProvider
interface which exposesNow
orUtcNow
properties. - An
IDateTimeOffsetProvider
interface which exposesNow
orUtcNow
properties.
Contains:
- A simple implementation
DateTimeProvider
of theIDateTimeProvider
interface. - A simple implementation
DateTimeOffsetProvider
of theIDateTimeOffsetProvider
interface. - And 2
IServiceCollection
extensions method to provide default implementations:AddDateTimeProvider()
to provide a singleton ofDateTimeProvider
when anIDateTimeProvider
is requiredAddDateTimeOffsetProvider()
to provide a singleton ofDateTimeOffsetProvider
when anIDateTimeOffsetProvider
is required
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDateTimeProvider();
services.AddDateTimeOffsetProvider();
...
}
Chronos.AspNetCore
was kept for compatibility reasons, but should be removed in further releases. Please use theIServiceCollection
extensions fromChronos.Net
instead which requires less dependencies.
Contains:
- And 2
WebHostBuilder
extensions method to provide default implementations:UseDateTimeProvider()
to provide a singleton ofDateTimeProvider
when anIDateTimeProvider
is requiredUseDateTimeOffsetProvider()
to provide a singleton ofDateTimeOffsetProvider
when anIDateTimeOffsetProvider
is required
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseDateTimeProvider()
.UseDateTimeOffsetProvider()
.UseStartup<Startup>();
Then instead of using DateTime.Now
, DateTime.UtcNow
, DateTimeOffset.Now
or DateTimeOffset.UtcNow
, you should use IDateTimeProvider.Now
, IDateTimeProvider.UtcNow
, IDateTimeOffsetProvider.Now
or IDateTimeOffsetProvider.UtcNow
which would enable you to fake/mock the time in your tests.
Example with FakeItEasy:
var dateTimeProvider = A.Fake<IDateTimeProvider>();
A.CallTo(() => dateTimeProvider.Now).Returns(new DateTime(2019, 3, 6, 9, 0, 0));
var franceOffset = TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time").BaseUtcOffset;
var dateTimeOffsetProvider = A.Fake<IDateTimeOffsetProvider>();
A.CallTo(() => dateTimeOffsetProvider.Now).Returns(new DateTime(2019, 3, 6, 9, 0, 0, franceOffset));
A sample web project can be found in the samples folder