Präambel
AutoFixture ursprünglich Build als ein Werkzeug für Test-Driven Development (TDD), und TDD ist alles über Rückmeldung. Im Geiste der GOOS, sollten Sie hören Sie Ihre Tests. Wenn die Tests schwer zu schreiben sind, sollten Sie Ihr API-Design in Betracht ziehen. AutoFixture neigt dazu, diese Art von Feedback zu verstärken, so ist meine erste Reaktion, um Ihre Motivation herausfordern, dies zu tun.
Ist DateTime der richtige Typ?
Wenn es wirklich darauf ankommt, dass DateTime-Werte in UTC sind, dann ist vielleicht System.DateTime
nicht der beste Datentyp für den Job. Vielleicht wäre DateTimeOffset eine bessere Option?
AutoFixture erstellt gerne DateTimeOffset-Werte für Sie.
Können Sie den Wert ändern, nachdem er generiert wurde?
Wenn Sie AutoFixture verwenden selbst die primitiven Werte zu erstellen, können Sie auch wandeln sie nur, nachdem Sie sie aus AutoFixture erhalten:
var dt = fixture.Create<DateTime>().ToUniversalTime();
Wenn Sie wirklich müssen AutoFixture Verhalten ändern
Wenn Sie jedoch die zu testende API nicht kontrollieren und diese DateTime-Werte in einer Datenstruktur tief verschachtelt sind, müssen Sie AutoFixture so konfigurieren, dass DateTime-Werte in UTC erstellt werden.
Hier ist eine Möglichkeit, es zu tun:
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();
}
}
Sie können es verwenden, von dieser vergänglichen Test demonstriert wie:
[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 Ihr Decorator ist einfacher als mein Ausstatter :) –