2014-03-27 4 views

Antwort

10

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.

+0

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. –

Verwandte Themen