我经常通过真实数据对我的服务进行测试。 Visual Studio 2015是否有一些扩展来帮助将调试器中的数据传输对象转换为XML或JSON表示(以后在单元测试中使用)?当然,我可以在某个执行点通过一些序列化代码来做到这一点,但这是一个肮脏的解决方案,需要重新编译(在我的情况下这可能需要长达10分钟)。
答案 0 :(得分:1)
不确定加载项或扩展,但是当所有其他方法都失败时,您可以使用Immediate Window生成所需的输出,如果需要,可以为中间结果定义临时全局变量。
示例1:当Newtonsoft.Json.dll
已经链接到您的项目时生成JSON输出。
假设您要为对象生成JSON,json.net未链接到当前项目但已下载到您的计算机上。您仍然可以使用它来生成立即窗口的输出,如下所示:
Open the Immediate Window如果尚未打开。
通过在提示符下键入Assembly.LoadFrom(...)
并使用适当的路径加载Newtonsoft DLL:
System.Reflection.Assembly.LoadFrom(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Documents\Visual Studio 2015\Projects\Json90r1\Bin\Net45\Newtonsoft.Json.dll"));
每个调试会话只需执行一次。
现在,只要您使用完全限定名称,就可以从立即窗口提示中调用JsonConvert.SerializeObject()
。例如。如果obj
是您希望看到JSON的变量,则可以键入:
System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented))
现在,调试输出将显示在即时窗口中,而不会转义。
扩展这个技巧,您可以创建一个包含单个公共静态方法My.Debug.Write(object o)
的小DLL,该方法以您想要的任何格式转储对象,然后将该DLL保存到开发计算机上方便的位置,例如{{ 1}}。然后在调试时,您可以加载DLL并调用调试输出方法,而不需要输入。
示例2:直接使用"c:\My.DLL"
。
假设您希望能够使用XmlSerializer
生成XML,但遗憾的是没有覆盖返回XML字符串;所有序列化方法都采用某种XmlSerializer
或Stream
。
您可以通过在立即窗口中定义临时全局变量来处理缺少适当的API,以保存中间对象(在这种情况下为编写器和设置),并序列化为这些对象:
再次打开立即窗口。
在立即窗口中,键入以下内容定义临时全局Writer
和StringBuilder
:
XmlWriterSettings
每个调试会话执行一次。
将System.Text.StringBuilder _sb = new System.Text.StringBuilder();
System.Xml.XmlWriterSettings _settings = new System.Xml.XmlWriterSettings();
_settings.Indent = true;
序列化到obj
并输入以下内容打印结果:
StringBuilder
每次会议可以多次这样做。
两种技巧都需要一点点打字,但两者都比等待10分钟重建更快。复制/粘贴一些保存的文本文件或注释也可以更快。