Visual Studio:在调试模式下捕获对象状态,并在单元测试中使用它

时间:2014-02-04 12:51:03

标签: visual-studio resharper visual-studio-debugging

是否有一种简单而优雅的方法可以在调试模式下捕获对象并将它们转储到单元测试中? 我正在使用一些非常大的对象(比如30多个字段),我需要将其作为单元测试中的数据。

2 个答案:

答案 0 :(得分:1)

我不知道这样做的任何快捷方式,事实上,我怀疑字段/属性,嵌套,私有公共的整个问题阻止VS提供通用的解决方案此

你当然可以使用序列化,例如在调试时在立即窗口中调用一些{{MyHelper.ToInitExpression()}},然后获取剪贴板数据并将其放入单元测试中。要创建初始化表达式,您需要使用反射来找出它们的属性/字段以及它们的当前值。如果你有嵌套对象,你也需要照顾它们。

如果你去ReSharper路线,另一种方法是生成某种ToInit()方法。您需要为您需要的每个类单独制作这些。使用ReSharper的发电机基础设施非常容易。如果你需要帮助,请随意给我打电话(skype:dmitri.nesteruk)。

另一种选择是简单地手工制作这样的方法,例如:

public static string ToAssemblyCode(this DateTime self)
{
  var sb = new StringBuilder("new System.DateTime(");
  sb.AppendFormat("{0},{1},{2}", self.Year, self.Month, self.Day);
  if (self.Hour != 0 || self.Minute != 0 || self.Second != 0)
    sb.AppendFormat(",{0},{1},{2}", self.Hour, self.Minute, self.Second);
  if (self.Millisecond != 0)
    sb.AppendFormat(",{0}", self.Millisecond);
  sb.Append(")");
  return sb.ToString();
}

答案 1 :(得分:1)

您可以尝试使用IntelliDebugger plugin for Visaul Studio在调试期间创建任何变量的快照。 IntelliDebugger允许您保存然后将对象与相同类型的其他对象进行比较。

IntelliDebugger Compare window

所需对象以XML格式存储在磁盘(<YourSolution>\_IntelliDebugger.<YourSolution>\ExpressionSnapshots文件夹)上。我设计了这个功能来比较调试期间的对象状态。也许它对编写单元测试很有用,或者我们可以针对这种情况进行改进。

注意:IntelliDebugger目前处于测试阶段且存在局限性。我们欢迎任何问题和功能要求,以使其更有效。