Builder 被赋予抽象时,如何使用 AutoFixture 生成特定值 class

How to use AutoFixture to generate specific values when the Builder is given an abstract class

我正在尝试使用 AutoFixture 为 class 生成特定值,但 Builder 被赋予 abstract class。因此,构建器看不到任何具体类型的属性...因此 cannot/doesn 不知道 when/how 来创建它们。

例如

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 时,我希望让它执行一些特定的逻辑。 (比如将名字设置为某个名字 + 姓氏)而如果 T 是一个 ConcreteB,则从 1 到 10 的某个随机数。

注意:我这样做的原因是因为我只是想不重复自己的基础class 属性(比如我想要 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