Как сгенерировать дату и время UTC по умолчанию при использовании автофиксации и автоданных?

#c# #autofixture

#c# #автоматическая фиксация

Вопрос:

У меня есть класс модели, как показано ниже:

 public class Students
{ 
     public string FirstName {get;set;}
     public string LastName {get;set;}
     public DateTime DateJoined {get;set;}
}
 

Затем я использую AutoFixture и AutoData для генерации случайных учеников:

 [Theory, AutoData]
public async Task Save_ShouldCreateStudent(Student student]
{
     var createdStudent = student;
     var createdStudentJoined = student.DateJoined; // This is in local date time format
}
 

Созданная дата не указана в UTC. Я хочу настроить Autofixture генерацию всех дат и времени в формате utc по умолчанию.

Во время моего исследования я нашел приведенный ниже пример, но он не подходит для меня, так как он использует Fact и создает экземпляр fixture. Я хочу, чтобы дата-время генерировалось в UTC, когда я использую Autodata, а значение генерируется из classed, переданного в самом параметре метода.

Примечание: приведенный ниже код взят из моих исследований и мне не помогает. Я ищу способ автоматической генерации UTC из моего приведенного выше кода для Student.DateJoined .

 public class UtcConverter : ISpecimenBuilder
{
    private readonly ISpecimenBuilder builder;

    public UtcConverter(ISpecimenBuilder builder)
    {
        this.builder = builder;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var t = request as Type;
        if (t == null amp;amp; t != typeof(DateTime))
            return new NoSpecimen(request);

        var specimen = this.builder.Create(request, context);
        if (!(specimen is DateTime))
            return new NoSpecimen(request);

        return ((DateTime)specimen).ToUniversalTime();
    }

    [Fact]
    public void ResolveUtcDate()
    {
         var fixture = new Fixture();
         fixture.Customizations.Add(
             new UtcConverter(
                new RandomDateTimeSequenceGenerator()));
         var dt = fixture.Create<DateTime>();
         Assert.Equal(DateTimeKind.Utc, dt.Kind);
    }
}
 

Ответ №1:

Похоже, вы хотите создать свой собственный AutoDataAttribute

 public class AutoDomainDataAttribute : AutoDataAttribute
{
    public AutoDomainDataAttribute ()
        : base(() => new Fixture().Customize(new MyDomainDataCustomization()))
    {
    }
}
 

где MyDomainDataCustomization находится настройка, которая инкапсулирует добавление ваших конструкторов спецификаций

 public class MyDomainDataCustomization : ICustomization
{
     public void Customize(IFixture fixture)
     {
         fixture.Customizations.Add(
             new UtcConverter(
                 new RandomDateTimeSequenceGenerator()));
      }
}
 

Итак, теперь вы можете украсить тест своим атрибутом AutoData.

 [Theory]
[AutoDomainData]
public void ResolveUtcDate(DateTime dt)
{
    Assert.Equal(DateTimeKind.Utc, dt.Kind);
}