单元测试中对象转LoanProgressResponse始终返回Null问题排查
问题排查与解决方案
核心原因:运行时类型不匹配
虽然result.Value的结构和LoanProgressResponse看起来完全一致,但实际运行时类型并非LoanProgressResponse,这是as转换返回null的本质原因。常见场景包括:
- 命名空间/程序集不一致:存在另一个结构完全相同但属于不同命名空间/程序集的类,
Invoke返回的是这个类的实例,而非你定义的LoanProgressResponse。 - JSON反序列化产物:
Invoke内部通过JSON反序列化生成对象时,未指定目标类型,返回的是JObject(Newtonsoft.Json)或JsonElement(System.Text.Json)这类JSON节点类型,而非强类型实例。 - 匿名类型:
Invoke返回的是匿名类型实例,而非预定义的LoanProgressResponse。
排查步骤
- 确认实际类型:调试时添加监视,查看
result.Value.GetType().FullName,对比typeof(LoanProgressResponse).FullName,确认两者是否完全一致(包括命名空间和程序集信息)。 - 检查反序列化逻辑:如果
Invoke涉及JSON反序列化,查看是否指定了正确的目标类型LoanProgressResponse。
针对性解决方案
- 类型不一致(命名空间/程序集)
统一使用同一个LoanProgressResponse类,或者手动映射属性:
var rawValue = result.Value; var okResult = new LoanProgressResponse { response_id = rawValue.response_id, status_code = rawValue.status_code, status_description = rawValue.status_description, current_progress = rawValue.current_progress, is_approved = rawValue.is_approved };
- JSON节点类型(JObject/JsonElement)
- 若使用Newtonsoft.Json:
var jObject = result.Value as JObject; var okResult = jObject?.ToObject<LoanProgressResponse>();
- 若使用System.Text.Json:
var jsonElement = result.Value as JsonElement; var okResult = JsonSerializer.Deserialize<LoanProgressResponse>(jsonElement.GetRawText());
- 匿名类型返回
修改Invoke方法的逻辑,使其返回LoanProgressResponse类型实例,而非匿名类型。
内容的提问来源于stack exchange,提问作者Hansen
相关产品推荐
相关产品推荐

