我正在尝试使用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
是附加到某个固定字符串的连续数字。
现在,当T
是ConcreteA
时,我希望让它做一些特定的逻辑。 (比如将名称设置为名字+姓氏),如果T
是ConcreteB
,那么从1到10的随机数。
注意:我这样做的原因是因为我只是考虑不重复自己的基类属性(比如我希望Id
属性为things-<consecutive number>
。
打开所有想法:)
答案 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