我们有一个需要修复的bug,就像任何优秀的TDD从业者一样,我想编写一个失败的测试来代表bug.该错误在一个方法中,它采用相当复杂的类型作为输入.只有当复杂类型具有特定的属性值组合时,该错误才会重现.
到目前为止,我已经重现了该错误,并且在调试器中,可以查看复杂类型的运行时值.现在我需要在单元测试的"排列"部分中创建该复杂类型,以便我可以将其提供给单元测试的"Act"部分中的buggy方法.
我可以手工编写一个大对象初始化代码块,如下所示:
var cats =
new List<Cat>
{
new Cat {Name = "Sylvester", Age = 8},
new Cat {Name = "Whiskers", Age = 2}
};
Run Code Online (Sandbox Code Playgroud)
甚至是这样的:
var cats = new List<Cat>();
var cat1 = new Cat();
cat1.Name = "Sylvester";
cat1.Age = 8;
cats.Add(cat1);
var cat2 = new Cat();
cat2.Name = "Whiskers";
cat2.Age = 2;
cats.Add(cat2);
Run Code Online (Sandbox Code Playgroud)
没有什么花哨的.唯一的问题是"手工"部分 - 在我的情况下复杂类型并不像上面的例子那样微不足道.
我还可以在调试器中使用任何内置调试器可视化工具查看对象.所以我想我会编写一个自定义Debugger Visualizer,它将为我生成对象初始化代码.要使用它,我会在调试器中重现该问题,拉出QuickWatch窗口并选择我的自定义可视化工具.
另一种选择是编写一个自定义序列化实现,它将"序列化"到一个对象初始化代码块.使用它比仅仅拉动QuickWatch窗口要困难一些,但这可能有效.
在我自己解决这个问题之前,有没有人做过这样的事情?介意分享一个代码片段?或者有人会建议另一种方法吗?
PS在我的例子中,对象的类型是抽象基类的子类.只是想提一下.