AutoFixture:如何从ISpecimenBuilder实现中正确使用BooleanSwitch()生成随机值?

时间:2019-01-16 10:18:24

标签: c# tdd autofixture

我有一个完全由字符串类型组成的类……对此我不满意,但无法更改。此类表示正在解析的某些CSV。

现在,我想生成伪造的实例。例如,我想生成随机的布尔值并将其转换为字符串。为此,我创建了ISpecimenBuilder的实现,到目前为止,该实现可以正常工作。

public class MyPropertyBuilder : ISpecimenBuilder
{
    private readonly Random rand;

    public MyPropertyBuilder()
    {
        this.rand = new Random();
    }
    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null)
        {
            return new NoSpecimen();
        }

        if (pi.PropertyType == typeof(string) && pi.Name == "MyPropertyName")
        {
            return (this.rand.NextDouble() > 0.5).ToString();
        }

        return new NoSpecimen();
    }
}

但是我不知道如何正确使用context.Resolve()*Request之类的RangedNumberRequest()类,如以下代码片段所示。

public class UnsignedIntegerNumberBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null)
        {
            return new NoSpecimen();
        }

        if (pi.PropertyType == typeof(string) && pi.Name == "ORDER_NR")
        {
            return context.Resolve(new RangedNumberRequest(typeof(int), 0, int.MaxValue)).ToString();
        }

        return new NoSpecimen();
    }
}

当然,我可以实现自己的方式来生成随机布尔值并使MyPropertyBuilder返回该值,但这是否违反了AutoFixture的目的,因为我以某种方式重新发明了某些原始类型的数据生成部分?

所以我想问题是:如何为特定属性正确使用AutoFixtures布尔值生成器?

1 个答案:

答案 0 :(得分:0)

如果我正确理解该类的所有属性均为string类型,但表示其他数据类型(布尔,整数或日期)。

我的建议是创建一个具有预期属性类型的FixtureBuilder类。使用Autfixture,您将能够生成随机值,然后将其转换为csv表示形式。

public class CsvData
{
    public string Enabled { get; set; }
    public string Quantity { get; set; }
    public string Price { get; set; }
}

public class CsvDataBuilder
{
    public bool Enabled { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; } 

    public CsvData ToCsvData()
    {
        return new CsvData
        {
            Enabled = Enabled.ToString(),
            Quantity = Quantity.ToString(),
            Price = Price.ToString()
        };
    }
}

然后在测试中,您可以在其中创建构建器

var dataFromCsv = new Fixture().Create<CsvDataBuilder>().ToCsvData();