シードされたプロパティを使用したAutofixtureビルダーのカスタマイズ

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

  •  28-10-2019
  •  | 
  •  

質問

統合テスト用のカスタマイズされたAutofixture Builderがあります。コードは以下にあります。

質問1-現在、最初のトランザクションにはtransactionViewkey.transactionIdが1などがあります。TransactionViewKeyTransactionIDを設定するには、Method Paramからシードされます。 BeginningTransactionId?たとえば、最初のTransactionIDが200であるTransactionViewsの配列を返すと、それぞれが1増加しますか?

質問2 -TransactionDateを決定するためのLambdaは、一度のみ実行されるようです。したがって、各日付は同じ値です。ビルダーをセットアップして、1回だけでなく生成されたインスタンスごとにランダムな日付ジェネレーターを実行するにはどうすればよいですか?

ありがとう

  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();
  }
役に立ちましたか?

解決

特定の質問に答える前に、もっと簡単なことを指摘したいと思います:あなた そうかもしれない createmanyに電話した後、結果を返す前に、それらの執筆可能なプロパティに値を割り当てるだけです。

このようなもの:

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

これはハックのように見えるかもしれませんが、実際にはそうではありません。自動フィックスは作成するように設計されています 匿名の値 したがって、特定の値(現在)を割り当てようとしているときはいつでも、元の目的の外に出ています。

誤解しないでください:このようなオートフィックスを使用するのはクールです。また、Autofixtureが作成している標本のメンバーに特定の値を割り当てる必要がある場合もありますが、GettersとSetterの通常の.NET APIは上記の手法を使用する傾向があります。 すでにそれを行うことに特化しています. 。一方、オートフィックスは、あいまいであるためのルールを定義することに特化しているため、その目的は逆です。

しかし、そうは言っても、上記の具体的な質問に答えます。

質問1

私はこれをコンパイルしようとしていないので、少し調整する必要があるかもしれませんが、あなたができる最善のことは次のようなことです:

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

質問2

withメソッドの2番目のパラメーターはです いいえ 代表者 - それはaです 価値 したがって、それは一度だけ評価されています。

毎回評価するには、上記と同じトリックを使用できます。

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

追加の質問がある場合はお知らせください。

Hth

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top