c# .net autofixture

c# - ¿Cómo puedo ordenar a AutoFixture que no se moleste en completar algunas propiedades?



.net (2)

Tengo un conjunto de clases de acceso a datos que están anidadas bastante.

Para construir una lista de 5 de ellos toma AutoFixture más de 2 minutos. 2 minutos por unidad de prueba es demasiado largo.

Si los estuviera codificando a mano, solo codificaría los que necesito, así que se iniciaría más rápido. ¿Hay una manera de decirle a AutoFixture que solo haga algunas de las propiedades para que no pueda pasar tiempo con las áreas de mi estructura que no necesito?

Por ejemplo:

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

¿Hay una manera de decirle a AutoFixture que cree valores para OfficeBuilding.Offices.YellowPages.LocalContacts , pero no se moleste con OfficeBuilding.Offices.YellowPages.AllContacts ?


La respuesta proporcionada por Nikos Baxevanis proporciona varias formas basadas en convenciones para responder a la pregunta. En aras de la integridad, también puede hacer una compilación más ad hoc:

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

Si quieres que tu instancia de Fixture haga esto siempre, puedes personalizarlo:

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

Cada vez que la instancia de Fixture crea una instancia de la Libreta de teléfonos, omitirá la propiedad AllContacts, lo que significa que puede ir:

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

y la propiedad AllContacts permanecerá intacta.


Una opción es crear una Personalización que omita propiedades de un nombre determinado:

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

Puedes usarlo de la siguiente manera:

var fixture = new Fixture(); fixture.Customizations.Add( new PropertyNameOmitter("AllContacts")); var sut = fixture.Create<OfficeBuilding>(); // -> The ''AllContacts'' property should be omitted now.

Ver también: