Autofixture: FromFactory no funciona como se esperaba

Creado en 26 oct. 2017  ·  3Comentarios  ·  Fuente: AutoFixture/AutoFixture

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.

question

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é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(c => c
.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(c => c
.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.

Todos 3 comentarios

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(c => c
.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(c => c
.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 :)

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

joelleortiz picture joelleortiz  ·  4Comentarios

ecampidoglio picture ecampidoglio  ·  7Comentarios

JoshKeegan picture JoshKeegan  ·  6Comentarios

Accc99 picture Accc99  ·  4Comentarios

Ridermansb picture Ridermansb  ·  4Comentarios