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

时间:2016-02-05 03:42:39

标签: c# .net autofixture

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

e.g。

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的假实例时,我希望在适当的时候设置一个concete值。

e.g。

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>

打开所有想法:)

1 个答案:

答案 0 :(得分:5)

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

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