propiedades - get y set c#
Establecer el valor de la propiedad en una instancia secundaria a un valor fijo con Autofixture (3)
No desestimar la pregunta, pero la solución más simple podría ser esta:
[Fact]
public void SimplestThingThatCouldPossiblyWork()
{
var fixture = new Fixture();
var expectedCity = "foo";
var person = fixture.Create<Person>();
person.Address.City = expectedCity;
Assert.Equal(expectedCity, person.Address.City);
}
La asignación de valores explícitos a las propiedades es algo en lo que la mayoría de los lenguajes ya sobresalen (C # ciertamente lo hace), por lo que no creo que AutoFixture necesite un DSL complicado para reproducir la mitad de esa funcionalidad.
¿Es posible asignar un valor fijo a una propiedad en una instancia secundaria cuando se crea un padre con Autofixture? Agregará valores predeterminados a todas las propiedades en la instancia secundaria como un encanto, pero me gustaría anular y asignar un valor específico a una de las propiedades en la instancia secundaria.
Dada esta relación padre / hijo:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
public int Number { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
Me gustaría asignar un valor específico a la propiedad Ciudad en la instancia de dirección. Estaba pensando en las líneas de este código de prueba:
var fixture = new Fixture();
var expectedCity = "foo";
var person = fixture
.Build<Person>()
.With(x => x.Address.City, expectedCity)
.Create();
Assert.AreEqual(expectedCity, person.Address.City);
Eso no es posible. Supongo, por la excepción del reflejo.
System.Reflection.TargetException : Object does not match target type.
... que Autofixture intenta asignar el valor a una propiedad de Ciudad en la instancia de Persona en lugar de una instancia de Dirección.
¿Alguna sugerencia?
Y sí, sé que podría agregar un paso adicional como el siguiente:
var fixture = new Fixture();
var expectedCity = "foo";
// extra step begin
var address = fixture
.Build<Address>()
.With(x => x.City, expectedCity)
.Create();
// extra step end
var person = fixture
.Build<Person>()
.With(x => x.Address, address)
.Create();
Assert.AreEqual(expectedCity, person.Address.City);
... pero esperaba la primera versión o algo similar (menos pasos, más terso).
Nota: estoy usando Autofixture v3.22.0
Para completar, aquí hay otra manera de hacerlo:
fixture.Customize<Address>(c =>
c.With(addr => addr.City, "foo"));
var person = fixture.Create<Person>();
Esto personalizará la creación de todas las instancias de Address
Si terminas usando esto con la frecuencia suficiente, puede valer la pena ICustomization
dentro de una personalización de ICustomization
:
public class AddressConventions : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<Address>(c =>
c.With(addr => addr.City, "foo"));
}
}
fixture.Customize(new AddressConventions());
Puedes usar un método Do en el constructor:
var person = this.fixture
.Build<Person>()
.Do( x => x.Address.City = expectedCity )
.Create();
También puedes inyectar y congelar tu instancia en el dispositivo:
this.fixture.Inject( expectedCity );