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:
- Omitir propiedades por tipo
- Omitir propiedades por espacio de nombres