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.
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
.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
.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 :)
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étodocomposer.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 #(c => c
f.Customize
.FromFactory (() => new TestClass ())
.Com (x => x.Property, "foobar"));
Como alternativa, você pode simplesmente desativar o preenchimento automático das propriedades se precisar:(c => c
`` `c #
f.Customize
.FromFactory (() => new TestClass {Property = "foobar"})
.OmitAutoProperties ());
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.