gpt4 book ai didi

c# - Autofixture - 新列表中基于先前构建的属性的属性

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:11 24 4
gpt4 key购买 nike

我想我遗漏了什么,但我想做的是:

我的 C# 代码中有两个数据库实体。一个是另一个的 child ,因此 child 包含一个字段,该字段应引用 parent 的 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; }
}

我创建了一个随机“ parent ”列表:

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 都是同一个,所以它显然只会命中 rand.Next一次。

我正在做的事情是否可行/可取?

最佳答案

当我为该属性提供值时,我希望使用相同构建器/夹具构建的所有实例都提供值。
所以你注意到的是期望的行为。

您可以提供一个“工厂”,而不是已经生成的值,它将在实例创建期间为属性生成值。
最新的 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

关于c# - Autofixture - 新列表中基于先前构建的属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com