Personnalisation du constructeur Autofixture avec propriété à tête de série

StackOverflow https://stackoverflow.com/questions/5398258

  •  28-10-2019
  •  | 
  •  

Question

J'ai un constructeur AutoFixture personnalisé pour un test d'intégration. Le code est ci-dessous.

Question 1 - À l'heure actuelle, la première transaction a une transactionViewkey.TransactionId de 1, etc. Comment puis-je définir la transactionViewkey TransactionID pour qu'elle soit ensemencée à partir de la méthode Param débutant? EG renvoyant un tableau de transactionViews où le premier transactionID est 200, puis chaque incrémentation de 1?

Question 2 - Le Lambda pour déterminer TransactionDate semble être exécuté une seule fois - et donc chaque date est de la même valeur. Comment configurer le constructeur afin qu'il exécute le générateur de date aléatoire pour chaque instance générée plutôt qu'une seule fois?

Merci

  static TransactionView[] CreateTransactions(int transactionsToReturnCount, long beginningTransactionId) {
      Random random = new Random();
      IFixture fixture = new Fixture();
      fixture.Customize<TransactionViewKey>(ob => ob
                                    .With(t => t.TransactionId)
                                    .With(t => t.TransactionIdSpecified, true)
                                    .OmitAutoProperties()
                                    );
      fixture.Customize<TransactionView>(ob => ob
                                             .With(t => t.TransactionDate, DateTime.Now - new TimeSpan(random.Next(30),0,0,0))
                                             .With(t => t.PostDate, DateTime.Now - new TimeSpan(random.Next(30), 0, 0, 0))
                                             .With(t => t.ViewKey)
                                             .With(t => t.Amount)
                                             .OmitAutoProperties()
          );
      IEnumerable<TransactionView> transactionViews = fixture.CreateMany<TransactionView>(transactionsToReturnCount);
      return transactionViews.OrderBy(t => t.TransactionDate).ToArray();
  }
Était-ce utile?

La solution

Avant de plonger pour répondre aux questions spécifiques, je voudrais souligner quelque chose qui pourrait être beaucoup plus facile: vous force Envisagez simplement d'attribuer des valeurs à ces propriétés en écriture après avoir appelé CreateMany, mais avant de retourner le résultat.

Quelque chose comme ça:

var transactionViews = fixture.CreateMany<TransactionView>(transactionsToReturnCount);
foreach (var tv in transactionViews)
{
    tv.ViewKey.TransactionId = beginningTransactionId++;
    tv.TransactionDate = DateTime.Now - new TimeSpan(random.Next(30),0,0,0);
}
return transactionViews.OrderBy(t => t.TransactionDate).ToArray();

Cela peut ressembler à un hack, mais ce n'est vraiment pas le cas. Autofixture est conçue pour créer Valeurs anonymes Ainsi, chaque fois que vous essayez d'attribuer des valeurs spécifiques (que vous êtes actuellement), vous sortez de son objectif d'origine.

Ne vous méprenez pas: c'est cool que vous utilisiez un automatique comme celui-ci. Je dois aussi parfois attribuer des valeurs spécifiques à certains membres des spécimens que j'ai créés automatique Déjà spécialisé pour faire exactement cela. Autofixture, en revanche, est spécialisée dans la définition des règles pour être vague, donc son objectif est le contraire.

Cela dit, cependant, je vais maintenant répondre aux questions spécifiques posées ci-dessus:

question 1

Je n'ai pas essayé de compiler cela, donc vous devrez peut-être le modifier un peu, mais la meilleure chose que vous puissiez faire serait quelque chose comme ceci:

fixture.Customize<TransactionViewKey>(ob => ob
    .Without(t => t.TransactionId)
    .Do(t => t.TransactionId = beginningTransactionId++)
    .With(t => t.TransactionIdSpecified, true)
    .OmitAutoProperties());

question 2

Le deuxième paramètre de la méthode avec ne pas un délégué - c'est un évaluer Il n'est donc évalué qu'une seule fois.

Pour l'évaluer à chaque fois, vous pouvez utiliser la même astuce que ci-dessus:

fixture.Customize<TransactionView>(ob => ob
    .Without(t => t.TransactionDate)
    .Do(t => t.TransactionDate = DateTime.Now - new TimeSpan(random.Next(30),0,0,0))
    .With(t => t.PostDate, DateTime.Now - new TimeSpan(random.Next(30), 0, 0, 0))
    .With(t => t.ViewKey)
    .With(t => t.Amount)
    .OmitAutoProperties());

Veuillez me faire savoir si vous avez des questions supplémentaires.

Hth

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top