将DTO(在调试器中)转换为XML?

时间:2016-08-11 14:02:22

标签: c# xml unit-testing

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

1 个答案:

答案 0 :(得分: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))
    

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

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

    示例2:直接使用"c:\My.DLL"

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

    您可以通过在立即窗口中定义临时全局变量来处理缺少适当的API,以保存中间对象(在这种情况下为编写器和设置),并序列化为这些对象:

    1. 再次打开立即窗口。

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

      XmlWriterSettings

      每个调试会话执行一次。

    3. System.Text.StringBuilder _sb = new System.Text.StringBuilder(); System.Xml.XmlWriterSettings _settings = new System.Xml.XmlWriterSettings(); _settings.Indent = true; 序列化到obj并输入以下内容打印结果:

      StringBuilder

      每次会议可以多次这样做。

    4. 两种技巧都需要一点点打字,但两者都比等待10分钟重建更快。复制/粘贴一些保存的文本文件或注释也可以更快。