Salut,
```C#
[Test Fixture]
classe publique 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"));
}
}
```
Ce test échoue en utilisant 4.0.0-rc1 sur .NET Core 2
Je pense que c'est soit trompeur (ou mal documenté) soit cassé .
EDIT : Ce n'est pas cassé, voir les commentaires ci-dessous.
J'ai remarqué que si j'ajoute .Without(_ => _.Property)
après la méthode FromFactory
, cela fonctionne comme prévu.
Je pense que c'est très contre-intuitif mais comme ce n'est pas un bug, nous pouvons le fermer.
Eh bien, c'est probablement un problème avec notre documentation ☺️
Par défaut, AutoFixture remplit automatiquement les propriétés avec des setters publics, à moins que vous ne désactiviez ce comportement en définissant fixture.OmitAutoProperties = true
. La méthode composer.FromFactory()
vous permet de spécifier comment activer l'instance du type particulier, mais les propriétés seront toujours attribuées à l'objet ultérieurement.
En fait, l'utilisation appropriée de l'API AutoFixture dépend du scénario. L'utilisation la plus "idiomatique" dans le scénario ci-dessus serait la suivante :
```c#
f.Personnaliser
.FromFactory(() => nouvelle ClasseTest())
.With(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"));
Alternativement, vous pouvez simplement désactiver le remplissage automatique des propriétés si vous en avez besoin :
```c#
f.Personnaliser
.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" });
Il peut être déroutant au début de comprendre quelle API exacte convient le mieux, mais plus tard, cela devrait être plus facile.
Faites-moi savoir si vous avez encore des questions à clarifier et je serai ravi de vous aider.
PS Les liens suivants peuvent également aider :
PPS La raison pour laquelle composer.Without(x => x.Property)
fonctionne est que cette expression désactive les propriétés automatiques pour la propriété/le champ particulier. Dans ce cas, AutoFixture ne remplace pas la valeur initiale de l'objet par celle générée automatiquement.
Merci beaucoup pour cette réponse incroyable ! Tu es incroyable :)
Commentaire le plus utile
Eh bien, c'est probablement un problème avec notre documentation ☺️
Par défaut, AutoFixture remplit automatiquement les propriétés avec des setters publics, à moins que vous ne désactiviez ce comportement en définissant
fixture.OmitAutoProperties = true
. La méthodecomposer.FromFactory()
vous permet de spécifier comment activer l'instance du type particulier, mais les propriétés seront toujours attribuées à l'objet ultérieurement.En fait, l'utilisation appropriée de l'API AutoFixture dépend du scénario. L'utilisation la plus "idiomatique" dans le scénario ci-dessus serait la suivante :
```c#(c => c
f.Personnaliser
.FromFactory(() => nouvelle ClasseTest())
.With(x => x.Property, "foobar"));
Alternativement, vous pouvez simplement désactiver le remplissage automatique des propriétés si vous en avez besoin :(c => c
```c#
f.Personnaliser
.FromFactory(() => new TestClass { Property = "foobar" })
.OmitAutoProperties());
Il peut être déroutant au début de comprendre quelle API exacte convient le mieux, mais plus tard, cela devrait être plus facile.
Faites-moi savoir si vous avez encore des questions à clarifier et je serai ravi de vous aider.
PS Les liens suivants peuvent également aider :
PPS La raison pour laquelle
composer.Without(x => x.Property)
fonctionne est que cette expression désactive les propriétés automatiques pour la propriété/le champ particulier. Dans ce cas, AutoFixture ne remplace pas la valeur initiale de l'objet par celle générée automatiquement.