我有以下嵌套的类,它们来自通过xsd.exe生成的XSD文件。
find ${Xml_Files} -name '*.xml' -type f -exec bash -c 'echo {}' \;
现在,我想使用AutoFixture生成具有合成数据的实例。
public class MyClass
{
public AnotherClass[] PropertyOne;
public DateTime PropertyTwo;
public bool PropertyTwoSpecified
}
public class AnotherClass
{
public DateTime AnotherPropertyOne
public bool AnotherPropertyOneSpecified
public int AnotherPropertyTwo
public bool AnotherPropertyTwoSpecified
}
我知道我可以使用var fixture = new Fixture();
fixture.Customize(new AutoFakeItEasyCustomization());
var myClassFake = fixture.Create<MyClass>();
来设置单个属性,但是如何根据特定模式设置属性?尤其是当此属性嵌套在数组中时?
我基本上必须确保所有以.with
结尾的属性都被设置为*Specified
。包括曾经嵌套到true
我是否必须使用一种基于反射的方法,例如扩展方法(例如PropertyOne
)还是有实现我目标的AutoFixture方法?
修改
我知道我可以使用myClassFake.EnableAllProperties()
将所有布尔值设置为true。这解决了我非常具体的问题,但仍然感到笨拙并且不普遍适用。仍在寻找解决此问题的精确方法。
答案 0 :(得分:1)
我最终创建了两个ISpecimenBuilder
实现,它们非常适合我的情况。
这将所有以* Specified结尾的布尔属性设置为true,而不会影响其他布尔属性。
public class SpecifiedBoolSpecimenBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi == null)
{
return new NoSpecimen();
}
if (pi.PropertyType != typeof(bool) || !pi.Name.EndsWith("Specified"))
{
return new NoSpecimen();
}
return true;
}
}
这个将特定属性设置为一系列随机值:
public class OidSpecimenBuilder : ISpecimenBuilder
{
public int Min { get; set; }
public int Max { get; set; }
public OidSpecimenBuilder(int min, int max)
{
this.Min = min;
this.Max = max;
}
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi == null)
{
return new NoSpecimen();
}
if (pi.PropertyType != typeof(long) || pi.Name != "OID")
{
return new NoSpecimen();
}
return context.Resolve(new RangedNumberRequest(typeof(long), Min, Max));
}
}