【问题标题】:Convert DTO (in Debugger) into XML?将 DTO(在调试器中)转换为 XML?
【发布时间】:2016-08-12 06:26:37
【问题描述】:

我经常通过真实数据对我的服务进行测试。 Visual Studio 2015 是否有一些扩展来帮助将调试器中的数据传输对象转换为 XML 或 JSON 表示(供以后在单元测试中使用)?当然,我可以在某个执行点通过一些序列化代码来做到这一点,但这是一个肮脏的解决方案,需要重新编译(在我的情况下这可能需要长达 10 分钟)。

【问题讨论】:

  • NS json 没有用于此的交互式调试器扩展。
  • 我不确定我是否理解您的目标......这样的插件将如何在 UT 环境中帮助您?
  • this answer创建一个类似XmlSerializationHelper的扩展方法,并在即时窗口中调用它。
  • 是否链接到您的项目中?

标签: c# xml unit-testing


【解决方案1】:

不确定加载项或扩展,但当所有其他方法都失败时,您可以使用 Immediate Window 生成所需的输出,并在需要时为中间结果定义临时全局变量。

示例 1:当Newtonsoft.Json.dll已链接到您的项目时生成 JSON 输出。

假设您想为一个对象生成 JSON,而 没有链接到您当前的项目,但已下载到您的机器上。您仍然可以使用它来生成立即窗口的输出,如下所示:

  1. Open the Immediate Window 如果尚未打开。

  2. 通过在提示符处键入 Assembly.LoadFrom(...) 并使用适当的路径来加载 Newtonsoft DLL:

    System.Reflection.Assembly.LoadFrom(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Documents\Visual Studio 2015\Projects\Json90r1\Bin\Net45\Newtonsoft.Json.dll"));
    

    每个调试会话只需执行一次。

  3. 现在,只要您使用完全限定名称,您就可以从即时窗口提示符调用JsonConvert.SerializeObject()。例如。如果 obj 是您希望查看 JSON 的变量,您可以输入:

    System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented))
    

    调试输出现在将出现在即时窗口中而不会转义。

扩展这个技巧,您可以创建一个包含单个公共静态方法 My.Debug.Write(object o) 的小 DLL,该方法以您想要的任何格式转储对象,然后将该 DLL 保存到您的开发机器上一个方便的位置,例如 "c:\My.DLL"。然后在调试时,您可以加载 DLL 并调用调试输出方法,而无需输入太多内容。

示例 2:直接使用XmlSerializer

假设您希望能够使用XmlSerializer 生成 XML,但不幸的是没有返回 XML 字符串的覆盖;所有的序列化方法都采用某种StreamWriter

您可以通过在即时窗口中定义临时全局变量来保存中间对象(在本例中为写入器和设置)并序列化到这些对象中来处理缺少适当 API 的问题:

  1. 再次打开即时窗口。

  2. 在即时窗口中,通过键入以下内容定义临时全局 StringBuilderXmlWriterSettings

    System.Text.StringBuilder _sb = new System.Text.StringBuilder();
    System.Xml.XmlWriterSettings _settings = new System.Xml.XmlWriterSettings();
    _settings.Indent = true;
    

    每个调试会话执行一次。

  3. 将您的obj 序列化为StringBuilder 并通过键入以下内容打印结果:

    _sb.Length = 0;
    new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(System.Xml.XmlWriter.Create(new System.IO.StringWriter(_sb), _settings), obj);
    System.Diagnostics.Debug.WriteLine(_sb);
    

    每个会话可以多次执行此操作。

这两个技巧都需要一些输入,但都比等待 10 分钟重建要快。从一些保存的文本文件或注释中复制/粘贴也可以更快。

【讨论】:

  • 完美答案!真的很有帮助,我什至不知道我能够从即时窗口加载程序集 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2018-09-14
  • 2020-01-06
  • 2019-04-22
相关资源
最近更新 更多