我想我错过了什么,但我想要做的是:
我的C#代码中有两个数据库实体。一个是另一个的孩子,因此孩子包含一个应该引用父母ID的字段。
父类如下
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public decimal DeliveryPrice { get; set; }
}
子类如下:
public class ProductOption
{
public Guid Id { get; set; }
public Guid ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
我已经创建了一个随机“父母”列表:
var products = fixture.CreateMany<Product>(5).ToList();
我想要做的是创建10个子对象,然后从AutoFixture创建的产品列表中随机给它们一个ProductId
。所以我尝试了这个:
var rand = new Random();
var options = fixture.Build<ProductOption>()
.With(option => option.ProductId, products[rand.Next(0, 5)].Id)
.CreateMany(10)
.ToList();
它几乎起作用,但我发现所有的ProductId
s都是同一个,所以它显然只有一次击中rand.Next
。
我正在做什么甚至可行/可取?
当我为属性提供值时,我希望所有使用相同构建器/ fixture构建的实例都会提供值。 所以你注意到的是期望的行为。
您可以提供一个“工厂”,而不是已经生成的值,它将在实例创建期间为属性生成值。
最新的Autofixture版本为.With
方法引入了重载,该方法接受函数作为参数。
var rand = new Random();
Func<Guid> pickProductId = () => products[rand.Next(0, 5)].Id;
var options =
fixture.Build<ProductOption>()
.With(option => option.ProductId, pickProductId)
.CreateMany(10)
.ToList();
// Prove
options.Select(o => o.ProductId).ToHashSet().Should().HaveCountGreaterThan(1); // Pass Ok