我有一个完全由字符串类型组成的类……对此我不满意,但无法更改。此类表示正在解析的某些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布尔值生成器?
答案 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();