Преамбула
AutoFixture первоначально (TDD), а TDD - около обратная связь. В духе GOOS вы должны послушать ваши тесты. Если тесты трудно писать, вы должны рассмотреть свой дизайн API. AutoFixture имеет тенденцию усиливать такую обратную связь, поэтому моя первая реакция заключается в том, чтобы бросить вызов вашей мотивации к желанию сделать это.
Является ли DateTime правильным типом?
Если действительно важно, чтобы значения DateTime находились в UTC, то, возможно, System.DateTime
не лучший тип данных для задания. Возможно, лучший вариант - DateTimeOffset?
AutoFixture с радостью создаст для вас значения DateTimeOffset.
Можете изменить значение после его создания?
Если вы используете AutoFixture для создания примитивных самих ценностей, вы также можете просто конвертировать их после того, как вы получите их от AutoFixture:
var dt = fixture.Create<DateTime>().ToUniversalTime();
Если вы действительно должны изменить поведение AutoFixture в
Однако, если вы не контролируете API, который вы тестируете, и те значения DateTime глубоко вложены в некоторую структуру данных, вам необходимо настроить AutoFixture для создания значений DateTime в UTC.
Вот один из способов сделать это:
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 && 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 Ваш декоратор проще, чем мой декоратор :) –