Autofixture: FromFactory ne fonctionne pas comme prévu

Créé le 26 oct. 2017  ·  3Commentaires  ·  Source: AutoFixture/AutoFixture

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.

question

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é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(c => c
.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(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" });

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.

Tous les 3 commentaires

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(c => c
.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(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" });

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 :)

Cette page vous a été utile?
0 / 5 - 0 notes