2013-08-20 7 views
16

Ho un set di classi di accesso ai dati che sono nidificate abbastanza in profondità.Come posso impostare AutoFixture in modo che non si preoccupi di riempire alcune proprietà?

Per creare un elenco di 5 di esse, la correzione automatica è superiore a 2 minuti. 2 minuti per test unitario è molto lungo.

Se stavo codificandoli a mano, avrei solo codificato quelli di cui avevo bisogno, in modo che inizializzasse più rapidamente. C'è un modo per dire a AutoFixture di fare solo alcune delle proprietà in modo che non possa passare il tempo con le aree della mia struttura che non mi servono?

Ad esempio:

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; } 
} 

C'è un modo per dire AutoFixture per creare valori per OfficeBuilding.Offices.YellowPages.LocalContacts, ma non perdere tempo con OfficeBuilding.Offices.YellowPages.AllContacts?

risposta

7

Una possibilità è quella di creare una personalizzazione che omette proprietà di un certo nome:

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); 
    } 
} 

Si può usare come qui sotto:

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

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

Vedi anche:

16

La risposta fornita da Nikos Baxevanis offre diversi modi di convenzione-based per rispondere alla domanda. Per completezza, si può anche fare un altro ad-hoc di compilazione:

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

Se volete che il vostro esempio fissaggio di fare sempre questo, è possibile personalizzarla:

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

Ogni volta che un'istanza di fissaggio crea un'istanza di rubrica, che sarà saltare la proprietà AllContacts, il che significa che si può andare:

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

e la proprietà AllContacts rimarrà intatto.

Problemi correlati