gpt4 book ai didi

c# - 当 Builder 被赋予抽象类时如何使用 AutoFixture 生成特定值

转载 作者:行者123 更新时间:2023-12-03 11:00:47 26 4
gpt4 key购买 nike

我正在尝试使用 AutoFixture 为类生成特定值,但 Builder得到一个 abstract类(class)。因此,构建器无法看到任一具体类型的属性……因此无法/不知道何时/如何创建它们。
例如

public abstract class BaseClass
{
// Common properties.
public string Id { get; set }
public Baa Baa { get; set; }
}

public class ConcreteA : BaseClass
{
public string Name { get; set ;}
}

public class ConcreteB : BaseClass
{
public NumberOfPeople int { get; set }
}
因此,当我创建 BaseClass 的假实例时,我希望在适当的情况下设置具体值。
例如
Class      | Property and value, to set.
----------------------------------------
ConcreteA | Name = "Jane"
ConcreteB | NumberOfPeople = 3
我不确定如何定义(在 Builder 中)当 currentType == typeof(ConcreteA) then do this...等等。
更新
这就是我目前创建我的假实例的方式:
public static T CreateAThing<T>() where T : BaseClass, new()
{
var fixture = new Fixture();
return fixture.Build<T>()
.With(x => x.Id, $"things-{fixture.Create<int>()}")
.Create();
}
哪里 Id是附加到某个固定字符串的连续数字。
现在,当 TConcreteA ,然后我希望让它做一些特定的逻辑。 (例如将名称设置为某个名字+姓氏)而如果 TConcreteB ,然后是从 1 到 10 的一些随机数。
注意:我这样做的原因是因为我只是在考虑不要为基类属性重复自己(就像我希望 Id 属性是 things-<consecutive number> 一样。
对所有想法开放:)

最佳答案

您可以单独自定义每种具体类型:

fixture.Customize<ConcreteA>(c => c.With(x => x.Name, "Jane"));
fixture.Customize<ConcreteB>(c => c.With(x => x.NumberOfPeople, 3));

随后,您可以简单地创建它们:
var a = fixture.Create<ConcreteA>();
var b = fixture.Create<ConcreteB>();

Console.WriteLine(a.Name);
Console.WriteLine(b.NumberOfPeople);

打印:
Jane
3

关于c# - 当 Builder 被赋予抽象类时如何使用 AutoFixture 生成特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35215921/

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