Daten Anmerkungen
Die einfachste Ansatz wahrscheinlich schmückt die Eigenschaft selbst mit einem Data Annotation, obwohl ich mich bin kein großer Fan von dieser:
public class MyDataClass
{
[Range(1, 60)]
public decimal Diameter { get; set; }
}
AutoFixture wird das respektieren [Range]
Attributwerte.
Convention-basierte
Ein besserer Ansatz ist, meiner Meinung nach, ein Kongressbasierten Ansatz, der nicht auf nicht-durchsetzbar Attribute angewiesen:
public class DiameterBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi == null ||
pi.Name != "Diameter" ||
pi.PropertyType != typeof(decimal))
return new NoSpecimen(request);
return context.Resolve(
new RangedNumberRequest(typeof(decimal), 1.0m, 60.0m));
}
}
dieser vergänglichen Test zeigt, wie verwenden, um es:
[Fact]
public void ResolveRangeLimitedType()
{
var fixture = new Fixture();
fixture.Customizations.Add(new DiameterBuilder());
var actual = fixture.Create<Generator<MyDataClass>>().Take(100);
Assert.True(actual.All(x => 1 <= x.Diameter && x.Diameter <= 60));
}
weitere Einzelheiten finden sie in this other, very closely related SO Q&A.
Überwindung Primitive Obsession
Vielleicht ein noch besserer Ansatz ist es, die Tests, zu bekämpfen Primitive Obsession und introduce a custom type zu hören - in diesem Fall ein Diameter
Value Object.
Dies ist oft mein bevorzugter Ansatz.
Ich möchte nicht DataAnnotations verwenden, da ich für eine Backend-Klasse gebraucht wird und keine UI hat. Gibt es einen einfacheren Weg, dies zu implementieren, ohne eine Klasse erstellen zu müssen (wenn auch eine kleine)? Ich habe vielleicht 2-3 Tests, bei denen dieser Bereich auf einem Integer-Wert benötigt wird. Es scheint ein bisschen viel zu sein, eine Klasse nur für eine kleine Handvoll von Orten hinzuzufügen, wo dies verwendet wird - und nur für eine einzelne Eigenschaft, die ein Int-Typ ist. Ich brauche die Bereichsbegrenzung nicht für alle Int-Typen. –