2013-08-20 4 views
16

Mam zestaw klas dostępu do danych, które są zagnieżdżone dość głęboko.Jak mogę nakazać AutoFixture, aby nie zawracała sobie głowy wypełnianiem niektórych właściwości?

Utworzenie listy 5 z nich zajmuje AutoFixture ponad 2 minuty. 2 minuty na test jednostkowy jest długa.

Gdybym kodował je ręcznie, zakodowałbym tylko te, których potrzebuję, aby były szybciej inicjowane. Czy istnieje sposób, aby powiedzieć AutoFixture, że wykonuje tylko niektóre z właściwości, więc nie może spędzać czasu z obszarami mojej struktury, których nie potrzebuję?

Na przykład:

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

Czy istnieje sposób, aby powiedzieć AutoFixture do tworzenia wartości dla OfficeBuilding.Offices.YellowPages.LocalContacts, ale nie przejmuj się OfficeBuilding.Offices.YellowPages.AllContacts?

Odpowiedz

7

Jedną z opcji jest stworzenie dostosowywania, które są pomijane właściwości określonej nazwie:

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

Można go używać jak poniżej:

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

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

Zobacz także:

16

Odpowiedź udzielana przez Nikos Baxevanis przewiduje różne sposoby konwencji opartej odpowiedzieć na pytanie. Przez wzgląd na kompletność, można również zrobić więcej build-hoc AD:

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

Jeśli chcesz, aby instancja Spotkań zawsze to zrobić, można je dostosować:

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

każdym razem, gdy instancja Spotkań tworzy instancję książki telefonicznej, to będzie pominąć właściwość AllContacts, co oznacza, że ​​można przejść:

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

a właściwość AllContacts pozostaną nietknięte.

Powiązane problemy