AutoFixture:如何根据模式手动设置(嵌套)属性

时间:2018-12-27 10:51:46

标签: c# tdd system.reflection autofixture

我有以下嵌套的类,它们来自通过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。这解决了我非常具体的问题,但仍然感到笨拙并且不普遍适用。仍在寻找解决此问题的精确方法。

1 个答案:

答案 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));
    }
}