2013-08-20 6 views
16

Ich habe eine Reihe von Datenzugriffsklassen, die ziemlich tief verschachtelt sind.Wie kann ich AutoFixture anweisen, einige Eigenschaften nicht zu ändern?

Um eine Liste von 5 von ihnen zu konstruieren dauert AutoFixture mehr als 2 Minuten. 2 Minuten pro Unit Test ist viel zu lang.

Wenn ich sie von Hand codiere, würde ich nur die kodieren, die ich brauche, also würde es schneller initialisieren. Gibt es eine Möglichkeit zu sagen, dass AutoFixture nur einige der Eigenschaften ausführt, so dass es keine Zeit mit Bereichen meiner Struktur verbringen kann, die ich nicht brauche?

Zum Beispiel:

public class OfficeBuilding 
{ 
    public List<Office> Offices {get; set;} 
} 

public class Office 
{ 
    public List<PhoneBook> YellowPages {get; set;} 
    public List<PhoneBook> WhitePages {get; set;} 
} 

public class PhoneBook 
{ 
    public List<Person> AllContacts {get; set;} 
    public List<Person> LocalContacts {get; set;} 
} 

public class Person 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set;} 
    public string LastName { get; set;} 
    public DateTime DateOfBirth { get; set; } 
    public char Gender { get; set; } 
    public List<Address> Addresses {get; set;} 
} 

public class Addresses 
{ 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
} 

Gibt es eine Möglichkeit zu sagen, AutoFixture Werte für OfficeBuilding.Offices.YellowPages.LocalContacts zu schaffen, aber nicht mit OfficeBuilding.Offices.YellowPages.AllContacts zu stören?

Antwort

7

Eine Möglichkeit ist es, eine Anpassung zu erstellen, die Eigenschaften eines bestimmten Namens auslässt:

internal class PropertyNameOmitter : ISpecimenBuilder 
{ 
    private readonly IEnumerable<string> names; 

    internal PropertyNameOmitter(params string[] names) 
    { 
     this.names = names; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     var propInfo = request as PropertyInfo; 
     if (propInfo != null && names.Contains(propInfo.Name)) 
      return new OmitSpecimen(); 

     return new NoSpecimen(request); 
    } 
} 

Sie können es verwenden, wie unten:

var fixture = new Fixture(); 
fixture.Customizations.Add(
    new PropertyNameOmitter("AllContacts")); 

var sut = fixture.Create<OfficeBuilding>(); 
// -> The 'AllContacts' property should be omitted now. 

Siehe auch:

16

Die Antwort von Nikos Baxevanis bietet Möglichkeiten, verschiedene Konvention Basis bereitgestellt, um die Frage zu beantworten. Der Vollständigkeit halber können Sie auch tun, eine Ad-hoc-Build:

var phoneBook = fixture.Build<PhoneBook>().Without(p => p.AllContacts).Create(); 

Wenn Sie Ihr Fixture Beispiel wollen immer das tun, können Sie es anpassen können:

fixture.Customize<PhoneBook>(c => c.Without(p => p.AllContacts)); 

Jedes Mal, wenn Fixture Instanz eine Instanz von Tel.buch schafft, wird es die AllContacts Eigenschaft, überspringen, was bedeutet, dass Sie gehen können:

var sut = fixture.Create<OfficeBuilding>(); 

und die AllContacts Eigentum bleiben unberührt.