能否在Visual Studio断点处捕获完整对象,用于单元测试Mock对象构建?
问题描述
在Visual Studio中使用「复制值」功能时,仅能复制局部变量窗口里对象名称这类单一值,希望找到可复制包含所有属性值、列表及嵌套对象的完整对象的方法,用于在单元测试中修改复用——复制粘贴比手动创建对象高效得多。
已考虑将对象序列化为JSON后在测试中重建,但想了解是否存在更优方案。当前环境为基于.NET 4.6(非Core)的MVC项目,使用xUnit框架,不确定这些环境因素是否会产生影响。
示例代码:
public ActionResult GetEmployees(SomeObject someObject) { // 希望从Visual Studio IDE获取someObject的全部值,someObject可能包含其他对象和列表 }
可行方案
1. Visual Studio 内置调试工具进阶用法
- 快速监视窗口序列化:调试时右键目标变量,选择「快速监视」,在弹出窗口中输入对应序列化代码:
- 若项目已引用Newtonsoft.Json:
Newtonsoft.Json.JsonConvert.SerializeObject(someObject) - 用.NET 4.6自带序列化类:
new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(someObject)
执行后直接复制生成的完整序列化结果即可。
- 若项目已引用Newtonsoft.Json:
- 直接复制为JSON:Visual Studio 2019及以上版本,调试状态下右键局部变量窗口中的对象,选择「复制为JSON」,可直接导出包含嵌套对象、列表的完整JSON结构,无需手动编写序列化代码。
2. 第三方调试扩展
- OzCode:支持将调试中的对象直接复制为可编译的C#对象初始化代码(包含嵌套对象、列表的完整结构),粘贴到单元测试中即可直接使用,还能快速修改属性值,完全兼容.NET 4.6项目。
- Resharper:右键调试中的对象,选择「Copy as C# Initializer」,生成的代码可直接在测试中复用,无需反序列化步骤,比JSON方案更直接。
3. 针对xUnit与.NET 4.6的适配
两种方案均能在当前环境下正常使用:
- JSON方案:引用Newtonsoft.Json后,在测试方法中通过
JsonConvert.DeserializeObject<SomeObject>(复制的JSON字符串)重建对象,再修改目标属性。 - C#初始化代码方案:直接将生成的代码粘贴到测试方法中,修改对应属性值即可,无额外依赖,完全适配.NET 4.6。
4. 自定义调试助手(可选)
若频繁需要该功能,可编写简单的调试助手类,调试时快速调用:
public static class DebugHelper { public static string ToFullObjectString<T>(T obj) { // 用.NET 4.6自带序列化 return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(obj); // 或用Newtonsoft.Json生成格式化后的结果 // return Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented); } }
调试时在快速监视窗口输入DebugHelper.ToFullObjectString(someObject),复制结果即可。
内容的提问来源于stack exchange,提问作者learntofix
相关产品推荐
相关产品推荐

