Hola,
`` C #
[Accesorio de prueba]
TestAutoFixture de clase pública {
public class TestClass
{
public string Property { get; set; }
}
[Test]
public void Test()
{
var f = new Fixture();
f.Customize<TestClass>(composer => composer.FromFactory(() => new TestClass { Property = "foobar" }));
var o = f.Create<TestClass>();
Assert.That(o.Property, Is.EqualTo("foobar"));
}
}
''
Esta prueba falla con 4.0.0-rc1 en .NET Core 2
Creo que esto es engañoso (o está mal documentado) o está roto .
EDITAR: No está roto, vea los comentarios a continuación.
Me di cuenta de que si agrego .Without(_ => _.Property)
después del método FromFactory
, funciona según lo previsto.
Creo que esto es muy contrario a la intuición, pero como no es un error, podemos cerrarlo.
Bueno, es probable que sea un problema con nuestra documentación ☺️
Por defecto, AutoFixture completa automáticamente las propiedades con establecedores públicos, a menos que desactive ese comportamiento configurando fixture.OmitAutoProperties = true
. El método composer.FromFactory()
permite especificar cómo activar la instancia del tipo en particular, sin embargo, las propiedades se seguirán asignando para el objeto más adelante.
En realidad, el uso adecuado de la API de AutoFixture depende del escenario. El uso más "idiomático" en el escenario anterior sería el siguiente:
`` c #
f. personalizar
.FromFactory (() => new TestClass ())
.Con (x => x.Propiedad, "foobar"));
or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
.With(x => x.Property, "foobar"));
Alternativamente, puede simplemente deshabilitar el llenado automático de propiedades si lo necesita:
`` c #
f. personalizar
.FromFactory (() => new TestClass {Property = "foobar"})
.OmitAutoProperties ());
However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:
```c#
f.Register(() => new TestClass { Property = "foobar" });
Puede ser confuso al principio entender qué API exacta se adapta mejor, pero luego debería ser más fácil. Toda esta API brinda flexibilidad y en diferentes escenarios las diferentes opciones se ven mejor.
Avísame si aún tienes algunas preguntas que aclarar y con gusto te ayudaré.
PD Los siguientes enlaces también pueden ayudar:
PPS La razón por la que funciona composer.Without(x => x.Property)
es que esta expresión deshabilita las propiedades automáticas para la propiedad / campo en particular. En ese caso, AutoFixture no anula el valor del objeto inicial con el generado automáticamente.
¡Muchas gracias por esta increíble respuesta! Eres increíble :)
Comentario más útil
Bueno, es probable que sea un problema con nuestra documentación ☺️
Por defecto, AutoFixture completa automáticamente las propiedades con establecedores públicos, a menos que desactive ese comportamiento configurando
fixture.OmitAutoProperties = true
. El métodocomposer.FromFactory()
permite especificar cómo activar la instancia del tipo en particular, sin embargo, las propiedades se seguirán asignando para el objeto más adelante.En realidad, el uso adecuado de la API de AutoFixture depende del escenario. El uso más "idiomático" en el escenario anterior sería el siguiente:
`` c #(c => c
f. personalizar
.FromFactory (() => new TestClass ())
.Con (x => x.Propiedad, "foobar"));
Alternativamente, puede simplemente deshabilitar el llenado automático de propiedades si lo necesita:(c => c
`` c #
f. personalizar
.FromFactory (() => new TestClass {Property = "foobar"})
.OmitAutoProperties ());
Puede ser confuso al principio entender qué API exacta se adapta mejor, pero luego debería ser más fácil. Toda esta API brinda flexibilidad y en diferentes escenarios las diferentes opciones se ven mejor.
Avísame si aún tienes algunas preguntas que aclarar y con gusto te ayudaré.
PD Los siguientes enlaces también pueden ayudar:
PPS La razón por la que funciona
composer.Without(x => x.Property)
es que esta expresión deshabilita las propiedades automáticas para la propiedad / campo en particular. En ese caso, AutoFixture no anula el valor del objeto inicial con el generado automáticamente.