2013-06-24 5 views
8

Ich versuche, eine Anpassung zu erstellen, die es mir ermöglicht anzugeben, dass die Eigenschaften von Typen, die sich nicht in einem bestimmten Namespace befinden, nicht aufgefüllt werden sollten.Wie erstellt man eine Anpassung, die die automatischen Eigenschaften für eine ganze Reihe von Typen auslässt?

Grundsätzlich Ich versuche, diese zu ändern:

fixture.Customize<Window>(c => c.OmitAutoProperties()); 
fixture.Customize<ContentControl>(c => c.OmitAutoProperties()); 
fixture.Customize<TextBlock>(c => c.OmitAutoProperties()); 
// Many many more... 

dazu:

fixture.Customize(t => !t.Namespace.StartsWith("MyProject"), 
        c => c.OmitAutoProperties()); 

Wie dies zu erreichen?

Ich interessiere mich eigentlich nur für das Ergebnis, nicht für die fiktive API, die hier gezeigt wird, so ist die Implementierung meiner eigenen ISpecimenBuilder oder ICustomization kein Problem.

Antwort

3

Der einfachste Weg, dies zu tun, ist wahrscheinlich durch eine benutzerdefinierte Probe Builder:

public class OmitPropertyForTypeInNamespace : ISpecimenBuilder 
{ 
    private readonly string ns; 

    public OmitPropertyForTypeInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     if (IsProperty(request) && 
      IsDeclaringTypeInNamespace((PropertyInfo)request)) 
     { 
      return new OmitSpecimen(); 
     } 

     return new NoSpecimen(request); 
    } 

    private bool IsProperty(object request) 
    { 
     return request is PropertyInfo; 
    } 

    private bool IsDeclaringTypeInNamespace(PropertyInfo property) 
    { 
     var declaringType = property.DeclaringType; 
     return declaringType.Namespace.Equals(
      this.ns, 
      StringComparison.OrdinalIgnoreCase); 
    } 
} 

Wie üblich, ist es eine gute Konvention ist auch eine passende Anpassung zur Verfügung zu stellen:

public class OmitAutoPropertiesForTypesInNamespace : ICustomization 
{ 
    private readonly string ns; 

    public OmitAutoPropertiesForTypesInNamespace(string ns) 
    { 
     this.ns = ns; 
    } 

    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(new OmitPropertyForTypeInNamespace(this.ns)); 
    } 
} 

Dadurch können Sie schließlich sagen:

var fixture = new Fixture(); 
fixture.Customize(new OmitAutoPropertiesForTypesInNamespace("MyProject")); 
+0

Danke, das wirkt wie ein Zauber! –

Verwandte Themen