Autofixture: Personnaliser avec une instruction lambda ne fonctionne pas - est-ce attendu ?

Créé le 7 juin 2018  ·  2Commentaires  ·  Source: AutoFixture/AutoFixture

Le test suivant échoue :

public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
            { // a statement lambda
                c.With(a => a.OperationAmount, "1");
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString()));
                return c;
            });
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }
    }

    public class PaymentReturnPayload
    {
        public PaymentReturnPayload(string control)
        {
            Control = control;
        }

        public string OperationAmount { get; set; }

        public string Control
        {
            get;
        }
    }

Le paramètre Control est renseigné par une chaîne aléatoire au lieu d'un entier généré.

Version 4.0 - 4.4 ( je n'ai pas testé les précédentes)
Noyau net 2.0 - 2.1

Cela fonctionne bien

[Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString())));
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }

Il semble que la personnalisation à l'aide d'une instruction lambda ne fonctionne pas.
Est-ce un comportement attendu ?
Et si oui, ne devrait-il pas être ajouté à une documentation ? J'ai perdu beaucoup de temps à comprendre ce qui ne va pas...

question

Tous les 2 commentaires

@progala2 Merci d'avoir soulevé la question.

Le comportement existant est par conception. La raison en est que les méthodes FromFactory , With (et Without ) sont immuables, elles ne modifient donc pas l'objet sous-jacent. Au lieu de cela, ils renvoient un nouvel objet avec un graphique configuré.

La raison pour laquelle le premier test ne fonctionne pas est que vous n'utilisez pas le résultat des appels, donc toutes les modifications appliquées sont ignorées. Une fois que vous avez réécrit le code correctement, cela fonctionnera également avec les instructions :

```c#
[Fait]
vide public Test1()
{
var fixture = new Fixture();
luminaire.Personnaliser(c =>
{
// une instruction lambda
var res = c.FromFactory(() => nouveau PaymentReturnPayload(fixture.Create().ToString()));
res = res.With(a => a.OperationAmount, "1");
retour res;
});

var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));

}


But as you might notice, it's easier to write this code with lambda.

P.S. By the way, you can slightly improve the final code (notice the `FromFactory` has overload taking extra values necessary for the object construction):
```c#
[Fact]
public void Test3()
{
    var fixture = new Fixture();
    fixture.Customize<PaymentReturnPayload>(c =>
        c.FromFactory((int control) => new PaymentReturnPayload(control.ToString())));

    var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
    Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}

Je vois, ils sont immuables - c'est très clair maintenant.
Merci pour votre réponse et quelques conseils supplémentaires !

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

Questions connexes

tomasaschan picture tomasaschan  ·  3Commentaires

tiesmaster picture tiesmaster  ·  7Commentaires

zvirja picture zvirja  ·  3Commentaires

Accc99 picture Accc99  ·  4Commentaires

ecampidoglio picture ecampidoglio  ·  7Commentaires