gpt4 book ai didi

c# - Autofixture 生成不重复的集合(按 ID)

转载 作者:行者123 更新时间:2023-11-28 20:03:52 27 4
gpt4 key购买 nike

我有以下类(class):

public class Foo
{
public List<DescriptionInfo> Descriptions { get; set; }
}


public class DescriptionInfo
{
public int LanguageId { get; set; }
public string Value { get; set; }
}

我想创建 Foo 实例,使用 Autofixture。但是,LanguageId 必须来自预定义列表。因此,我创建了以下定制:

public class LanguageIdSpecimenBuilder : ISpecimenBuilder
{
private static readonly List<int> LanguageIds = new List<int> {
1,
2,
666,
};

public object Create(object request, ISpecimenContext context)
{
var info = request as PropertyInfo;
if (info != null)
{
if (info.Name == "LanguageID")
{
return LanguageIds.GetRandomElement();
}
}
return new NoSpecimen(request);
}
}

现在一切都很好:

Fixture fixture = new Fixture();
fixture.Customizations.Add(new LanguageIdSpecimenBuilder());
var foo = fixture.Create<Foo>();

但是,还有一个要求:一个语言 ID 不能有重复条目。我怎样才能做到这一点?

编辑:例如,有效实例是:

Foo1:
- LanguageId: 1, Value: "english description_ae154c"
- LanguageId: 2, Value: "zuzulu_510b7g"

Foo2:
- LanguageId: 1, Value: "english description_87f5de"
- LanguageId: 666, Value: "chinese_35e450"
- LanguageId: 2, Value: "zuzulu_fe830d"

无效实例:

Foo1:
- LanguageId: 1, Value: "_04dcd6"
- LanguageId: 1, Value: "_66ccc4"
- LanguageId: 2, Value: "zuzulu_c05b0f"

最佳答案

首先 - 让我建议您的 POC 可以更精确。如果您不允许在列表中使用相同的 LanguageID 描述,您可以像这样改造您的 POC:

public class Foo
{
public ISet<DescriptionInfo> Descriptions { get; set; }
}

public class DescriptionInfo
{
public int LanguageID { get; set; }
public string Value { get; set; }

public override bool Equals(object obj)
{
var anotherInfo = (DescriptionInfo)obj;
return anotherInfo.LanguageID == LanguageID;
}

public override int GetHashCode()
{
return LanguageID;
}
}

问题解决了:

fixture.Customizations.Add(new TypeRelay(typeof(ISet<DescriptionInfo>),
typeof(HashSet<DescriptionInfo>)));
fixture.Customizations.Add(new LanguageIdSpecimenBuilder());
var foo = fixture.Create<Foo>();

如果您不能/不想改造您的 POC,您应该在自定义构建器中关注您想要正确设置的属性 - Descriptions

public object Create(object request, ISpecimenContext context)
{
var info = request as PropertyInfo;
if (info != null && info.Name == "Descriptions" && info.DeclaringType == typeof(Foo))
{
if (info.Name == "Descriptions")
{
return context.Create<List<DescriptionInfo>>()
.GroupBy(g => g.LanguageId)
.Select(g => g.First())
.ToList();
}
}
if (info != null && info.Name == "LanguageId" && info.DeclaringType == typeof(DescriptionInfo))
{
return LanguageIds.GetRandomElement();
}
return new NoSpecimen(request);
}

最后一点——你的代码片段是错误的——字符串比较区分大小写;所以它应该是 info.Name == "LanguageId",检查声明属性的类型——而不仅仅是属性名称也是个好主意。

关于c# - Autofixture 生成不重复的集合(按 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35552110/

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