使用种子属性自定义AutoFixture构建器

我有一个定制的自动混合构建器用于集成测试。 代码如下。

问题1 – 目前第一个事务的TransactionViewKey.TransactionId为1,等等。如何设置TransactionViewKey TransactionId,使其从方法param beginTransactionId中播种? 例如,返回第一个TransactionId为200的TransactionViews数组,然后每个递增1?

问题2 – 用于确定transactiondate的lambda似乎只运行一次 – 所以每个日期都是相同的值。 如何设置构建器,以便为每个生成的实例运行随机日期生成器而不是仅运行一次?

谢谢

static TransactionView[] CreateTransactions(int transactionsToReturnCount, long beginningTransactionId) { Random random = new Random(); IFixture fixture = new Fixture(); fixture.Customize(ob => ob .With(t => t.TransactionId) .With(t => t.TransactionIdSpecified, true) .OmitAutoProperties() ); fixture.Customize(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 transactionViews = fixture.CreateMany(transactionsToReturnCount); return transactionViews.OrderBy(t => t.TransactionDate).ToArray(); } 

在我开始回答具体问题之前,我想指出一些可能更容易的事情:在调用CreateMany之后但在返回结果之前, 可能会考虑将值分配给那些可写属性。

像这样的东西:

 var transactionViews = fixture.CreateMany(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旨在创建匿名值,因此每当您尝试分配特定值(当前是您的)时,您都会超出其原始目的。

不要误会我的意思:你使用像这样的AutoFixture很酷。 我有时也必须为我有AutoFixture创建的标本的某些成员分配一些特定值,但我倾向于使用上述技术,因为getter和setter的正常.NET API 已经专门用于完成 。 另一方面,AutoFixture专门用于定义模糊的规则,因此其目的恰恰相反。

尽管如此,我现在回答上面提出的具体问题:

问题1

我没有尝试编译它,所以你可能需要调整一下,但你可以做的最好的事情是这样的:

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

问题2

With方法的第二个参数不是委托 – 它是一个值,所以它只被评估一次。

要每次评估它,您可以使用与上面相同的技巧:

 fixture.Customize(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