Autofixture: FromFactory não funciona como esperado

Criado em 26 out. 2017  ·  3Comentários  ·  Fonte: AutoFixture/AutoFixture

Oi,

`` `C #
[TestFixture]
public class TestAutoFixture {

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

`` `

Este teste falha usando 4.0.0-rc1 no .NET Core 2
Eu acho que isso é enganoso (ou mal documentado) ou quebrado .
EDIT: Não está quebrado, veja os comentários abaixo.

question

Comentários muito úteis

Bem, provavelmente é um problema com a nossa documentação ☺️

Por padrão, a AutoFixtura preenche automaticamente as propriedades com configuradores públicos, a menos que você desative esse comportamento configurando fixture.OmitAutoProperties = true . O método composer.FromFactory() permite que você especifique como ativar a instância do tipo particular, no entanto, as propriedades ainda serão atribuídas para o objeto mais tarde.

Na verdade, o uso adequado da API AutoFixture depende do cenário. O uso mais "idiomático" no cenário acima seria o seguinte:

`` `c #
f.Customize(c => c
.FromFactory (() => new TestClass ())
.Com (x => x.Property, "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"));

Como alternativa, você pode simplesmente desativar o preenchimento automático das propriedades se precisar:
`` `c #
f.Customize(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" });

Pode ser confuso no início entender qual API exata se adapta melhor, mas depois deve ser mais fácil 😉Toda essa API oferece flexibilidade e, em diferentes cenários, as diferentes opções parecem melhores.

Avise-me se ainda tiver alguma dúvida a esclarecer e será um prazer ajudá-lo.

PS Os links a seguir também podem ajudar:

PPS O motivo pelo qual composer.Without(x => x.Property) funciona é que essa expressão desabilita as propriedades automáticas para a propriedade / campo específico. Nesse caso, a AutoFixtura não substitui o valor inicial do objeto pelo gerado automaticamente.

Todos 3 comentários

Percebi que se eu adicionar .Without(_ => _.Property) após o método FromFactory , ele funciona conforme o planejado.
Eu acho que isso é muito contra-intuitivo, mas como não é um bug, podemos fechar isso.

Bem, provavelmente é um problema com a nossa documentação ☺️

Por padrão, a AutoFixtura preenche automaticamente as propriedades com configuradores públicos, a menos que você desative esse comportamento configurando fixture.OmitAutoProperties = true . O método composer.FromFactory() permite que você especifique como ativar a instância do tipo particular, no entanto, as propriedades ainda serão atribuídas para o objeto mais tarde.

Na verdade, o uso adequado da API AutoFixture depende do cenário. O uso mais "idiomático" no cenário acima seria o seguinte:

`` `c #
f.Customize(c => c
.FromFactory (() => new TestClass ())
.Com (x => x.Property, "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"));

Como alternativa, você pode simplesmente desativar o preenchimento automático das propriedades se precisar:
`` `c #
f.Customize(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" });

Pode ser confuso no início entender qual API exata se adapta melhor, mas depois deve ser mais fácil 😉Toda essa API oferece flexibilidade e, em diferentes cenários, as diferentes opções parecem melhores.

Avise-me se ainda tiver alguma dúvida a esclarecer e será um prazer ajudá-lo.

PS Os links a seguir também podem ajudar:

PPS O motivo pelo qual composer.Without(x => x.Property) funciona é que essa expressão desabilita as propriedades automáticas para a propriedade / campo específico. Nesse caso, a AutoFixtura não substitui o valor inicial do objeto pelo gerado automaticamente.

Muito obrigado por esta resposta incrível! Você é incrível :)

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Accc99 picture Accc99  ·  4Comentários

ecampidoglio picture ecampidoglio  ·  7Comentários

tiesmaster picture tiesmaster  ·  7Comentários

gtbuchanan picture gtbuchanan  ·  3Comentários

zvirja picture zvirja  ·  3Comentários