Simple library to help abstracting time in dotnet projects, usually for testing purpose.
Contains:
- An
IDateTimeProviderinterface which exposesNoworUtcNowproperties. - An
IDateTimeOffsetProviderinterface which exposesNoworUtcNowproperties.
Contains:
- A simple implementation
DateTimeProviderof theIDateTimeProviderinterface. - A simple implementation
DateTimeOffsetProviderof theIDateTimeOffsetProviderinterface. - And 2
IServiceCollectionextensions method to provide default implementations:AddDateTimeProvider()to provide a singleton ofDateTimeProviderwhen anIDateTimeProvideris requiredAddDateTimeOffsetProvider()to provide a singleton ofDateTimeOffsetProviderwhen anIDateTimeOffsetProvideris required
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDateTimeProvider();
services.AddDateTimeOffsetProvider();
...
}
Chronos.AspNetCorewas kept for compatibility reasons, but should be removed in further releases. Please use theIServiceCollectionextensions fromChronos.Netinstead which requires less dependencies.
Contains:
- And 2
WebHostBuilderextensions method to provide default implementations:UseDateTimeProvider()to provide a singleton ofDateTimeProviderwhen anIDateTimeProvideris requiredUseDateTimeOffsetProvider()to provide a singleton ofDateTimeOffsetProviderwhen anIDateTimeOffsetProvideris 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