有几种方法可以为测试(不仅限于单元测试)生成数据,例如对象工厂、构建器等。另一种有用的方法是将测试数据编写成纯文本:
product: Main; prices: 145, 255; Expire: 10-Apr-2011; qty: 2; includes: Sub
product: Sub; prices: 145, 255; Expire: 10-Apr-2011; qty: 2
然后将其解析为C#对象。这在单元测试中很容易使用(因为深度内部集合可以写成单行),在类似FitNesse的系统中使用更方便(因为这种DSL自然适合wiki),等等。因此,我使用它并编写解析器,但每次编写都很繁琐。我不是DSL /语言解析器的大专家,但我认为它们可以在这里提供帮助。哪种才是正确的选择?我只听说过:
- DSL(我的意思是任何 DSL) - Boo(我认为可以做DSL) - ANTLR
但我甚至不知道该选择哪一个和从哪里开始。
所以问题是:使用某种DSL来生成测试数据是否合理?您建议怎么做?是否存在任何现有案例?
更新:似乎我没有表达清楚。这不是关于原始字符串到对象转换的问题。请看第一行并将其与下面的内容联系起来。
var main = Product.New("Main")
.AddPrice(Price.New(145).WithType(PriceType.Main).AndQty(2))
.AddPrice(Price.New(255).WithType(PriceType.Maintenance).AndQty(2))
.Expiration(new DateTime(10, 04, 2011));
var sub = Product
.New("Sub").Parent(main)
.AddPrice(...));
main.AddSubProduct(sub);
products.Add(main);
products.Add(sub);
请注意,我首先创建子产品,然后将其添加到主产品中,即使它以相反的顺序列出。价格以一种特殊的方式处理。我想指定子产品的名称并获取对其的引用-已创建。我想在单行上列出所有产品属性-FLAT和NON-REPEATATIVE。我想使用属性的默认值。等等。
更新:我不确定是否应避免DSL,因为所有替代示例都太冗长且不用户友好。没有人对DSL提供有用的信息。