Debugger Visualizer生成Object Initializer代码

时间:2010-11-17 20:55:43

标签: c# visual-studio unit-testing debugging debuggervisualizer

我们有一个bug需要修复,就像任何优秀的TDD从业者一样,我想编写一个失败的测试来代表bug。该错误在一个方法中,它采用相当复杂的类型作为输入。只有在复杂类型具有特定的属性值组合时,该错误才会重现。

到目前为止,我已经重现了该错误,并且在调试器中,可以查看复杂类型的运行时值。现在我需要在单元测试的“排列”部分创建复杂类型,以便我可以将其提供给单元测试“Act”部分中的buggy方法。

我可以手工编写一个大对象初始化代码块,如下所示:

var cats =
    new List<Cat>
        {
            new Cat {Name = "Sylvester", Age = 8},
            new Cat {Name = "Whiskers", Age = 2}
        };

甚至是这样的:

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);

没有什么花哨的。唯一的问题是“手工”部分 - 在我的情况下复杂类型并不像上面的例子那么简单。

我还可以在调试器中使用任何内置调试器可视化工具查看对象。所以我想我会编写一个自定义Debugger Visualizer,它将为我生成对象初始化代码。要使用它,我会在调试器中重现该问题,拉出QuickWatch窗口并选择我的自定义可视化工具。

另一个选择是编写一个自定义序列化实现,它将“序列化”到一个对象初始化代码块。使用它比仅仅拉动QuickWatch窗口要困难一些,但这可能有效。

在我自己解决这个问题之前,有没有人做过这样的事情?介意分享一个代码片段?或者有人会提出另一种方法吗?

P.S。在我的例子中,对象的类型是抽象基类的子类。只是想提一下。

3 个答案:

答案 0 :(得分:10)

这是一个名为Object Exporter的工具,它可以完全满足您的需求,它将从调试窗口中的任何对象生成C#初始化代码:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

博客文章包含更多信息:

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

答案 1 :(得分:0)

我不知道提供您正在寻找的行为的任何现有功能/功能。但是编写Visualizer来为给定对象生成代码的想法对于简单的对象类型来说似乎是合理的:那些由基本类型的属性组成。一旦超越这个任务变得越来越困难。

在可视化工具中,您可以访问相关对象,并可以使用反射等技巧来获取成员。原始类型重复表示成员的值作为代码:intstring等等。这对于非原始类型来说要困难得多,因为该过程变得递归并且您需要考虑对象周期。

如果这对您有用,请参阅Debugger Visualizers的快速教程

总而言之,只需手写每个场景可能更容易:(

答案 2 :(得分:0)

这些建议不起作用。 阅读第一行

  

您可以为其编写自定义可视化工具   除了之外的任何托管类的对象   对象或数组。

http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

有你的答案。如果我正确阅读,则无法通过可视化工具实现。跛脚。