解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”
Posted
技术标签:
【中文标题】解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”【英文标题】:Parsing dynamic jsonResult response from API gives "object does not contain definition for X" 【发布时间】:2018-03-22 21:08:09 【问题描述】:我试图像这样返回一个非常简单的匿名对象作为 Json:
[HttpGet]
public JsonResult GetJson()
return Json(new
id = 1,
child = new
id = 12,
name = "woop woop"
);
然后我有一个测试用例验证 id = 1
[TestMethod]
public void TestMethod4()
var controller = new ValuesController();
dynamic result = controller.GetJson();
Assert.AreEqual(1, result.Value.id);
这导致:
消息:测试方法 UnitTestProject1.UnitTest1.TestMethod4 抛出 异常:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: “object”不包含“id”的定义
【问题讨论】:
【参考方案1】:您的方法返回一个JsonResult
,其中包含一个属性Data
,这是您的对象,因此您的代码应该是
[TestMethod]
public void TestMethod4()
var controller = new ValuesController();
dynamic result = controller.GetJson().Data; // returns id = 1, child = new id = 12, name = "woop woop"
Assert.AreEqual(1, result.id);
但是匿名对象是internal
,因此您还需要使您的对象对您的测试项目可见。在包含ValuesController
类的项目的AssemblyInfo.cs
文件中,添加
[assembly: InternalsVisibleTo("YourProjectName.UnitTestProject1")]
【讨论】:
不错的答案。也会对其他人有所帮助 GetJson() 没有 .Data,它有 .Value。我没有任何 AssemblyInfo.cs 文件。这是一个 .Net Core 1.1 项目。 然后正确标记您的问题! 请参阅this answer 以获取与AssemblyInfo.cs
等效的信息
还有this answer以上是关于解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core API 中的 IActionResult vs ObjectResult vs JsonResult