如何在为Builder提供抽象类时使用AutoFixture生成特定值

Pur*_*ome 2 .net c# autofixture

我正在尝试使用AutoFixture为类生成特定值,但是Builder给出了一个abstract类.因此,构建器无法查看具体类型的属性...因此canot /不知道何时/如何创建它们.

例如

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 }
}
Run Code Online (Sandbox Code Playgroud)

所以,当我创建一个BaseClass的假实例时,我希望在适当的时候设置concete值.

例如

Class      | Property and value, to set.
----------------------------------------
ConcreteA  | Name = "Jane"
ConcreteB  | NumberOfPeople = 3
Run Code Online (Sandbox Code Playgroud)

我不知道如何定义(在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();
}
Run Code Online (Sandbox Code Playgroud)

其中Id是一个连续数字附加到某个固定字符串.

现在,什么时候TConcreteA,然后我希望它有一些特定的逻辑.(比如将名称设置为某个名字+姓氏),而if T是a ConcreteB,然后是1到10之间的一些随机数.

注意:我这样做的原因是因为我只是在考虑不重复自己的基类属性(就像我想要Id属性一样)things-<consecutive number>.

所有想法开放:)

Mar*_*ann 5

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

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

随后,您可以简单地创建它们:

var a = fixture.Create<ConcreteA>();
var b = fixture.Create<ConcreteB>();

Console.WriteLine(a.Name);
Console.WriteLine(b.NumberOfPeople);
Run Code Online (Sandbox Code Playgroud)

打印:

Jane
3
Run Code Online (Sandbox Code Playgroud)