propiedades c# hierarchy autofixture

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