#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);
}