Search code examples
autofixture

Let AutoFixture create DateTime in UTC?


By default AutoFixture creates DateTime structs in "local, unspecified time".

I have been trying to find a way to configure it to create DateTime structs with UTC kind, but so far unsuccessful.

Is there a way to do this?


Solution

  • You can use a Decorator for this (although easier solutions might also exist):

    var fixture = new Fixture();
    fixture.Customizations.Add(new UtcRandomDateTimeSequenceGenerator());
    
    var dateTime = fixture.Create<DateTime>();
    // -> The value of 'dateTime' is in Coordinated Universal Time (UTC).
    

    The UtcRandomDateTimeSequenceGenerator is defined as:

    internal class UtcRandomDateTimeSequenceGenerator : ISpecimenBuilder
    {
        private readonly ISpecimenBuilder innerRandomDateTimeSequenceGenerator;
    
        internal UtcRandomDateTimeSequenceGenerator()
        {
            this.innerRandomDateTimeSequenceGenerator = 
                new RandomDateTimeSequenceGenerator();
        }
    
        public object Create(object request, ISpecimenContext context)
        {
            var result = 
                this.innerRandomDateTimeSequenceGenerator.Create(request, context);
            if (result is NoSpecimen)
                return result;
    
            return ((DateTime)result).ToUniversalTime();
        }
    }