Domanda

Ho un costruttore AutoFixture personalizzato per un test di integrazione. Il codice è di seguito.

Domanda 1 - Attualmente la prima transazione ha una transazioneviewkey.transactionid di 1, ecc. Come posso impostare la transazione di transactionviewkey in modo che sia seminato dal metodo param INIZIONETRANSAZIONEID? ad esempio restituendo una matrice di transazioni in cui la prima transazione è 200, quindi ciascuna che aumenta di 1?

Domanda 2 - La lambda per determinare la data di transazione sembra essere eseguita solo una volta - e quindi ogni data ha lo stesso valore. Come si imposta il costruttore in modo che esegui il generatore di date casuali per ogni istanza generata anziché solo una volta?

Grazie

  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();
  }
È stato utile?

Soluzione

Prima di immergermi nel rispondere alle domande specifiche, vorrei sottolineare qualcosa che potrebbe essere molto più facile: tu potrebbe Considera solo di assegnare valori a quelle proprietà scrivibili dopo aver chiamato CreateMeMany, ma prima di restituire il risultato.

Qualcosa come questo:

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();

Potrebbe sembrare un hack, ma in realtà non lo è. L'autofixture è progettata per creare Valori anonimi Quindi, ogni volta che stai cercando di assegnare valori specifici (che sei attualmente), stai uscendo dal suo scopo originale.

Non fraintendetemi: è bello usare l'autofixture in questo modo. A volte devo anche assegnare alcuni valori specifici ad alcuni membri dei campioni che ho creata automaticamente già specializzato nel fare esattamente questo. L'autofixture, d'altra parte, è specializzata nel definire le regole per essere vaghi, quindi il suo scopo è il contrario.

Detto questo, tuttavia, risponderò ora alle domande specifiche poste sopra:

Domanda 1

Non ho provato a compilare questo, quindi potresti doverlo modificarlo un po ', ma la cosa migliore che puoi fare sarebbe qualcosa del genere:

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

Domanda 2

Il secondo parametro al metodo è non un delegato: è un valore Quindi viene valutato solo una volta.

Per valutarlo ogni volta, puoi usare lo stesso trucco di sopra:

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());

Per favore fatemi sapere se hai ulteriori domande.

Hth

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top