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
是一个连续数字附加到某个固定字符串.
现在,什么时候T
是ConcreteA
,然后我希望它有一些特定的逻辑.(比如将名称设置为某个名字+姓氏),而if T
是a ConcreteB
,然后是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));
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)
归档时间: |
|
查看次数: |
3002 次 |
最近记录: |