c# - 解析来自 API 的动态 jsonResult 响应给出 "object does not contain definition for X"

标签 c# asp.net-mvc asp.net-core-mvc anonymous-types

我试图像这样返回一个非常简单的匿名对象作为 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);
    }

结果是:

Message: Test method UnitTestProject1.UnitTest1.TestMethod4 threw exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'id'

Image from VS

最佳答案

你的方法返回一个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);
}

但是匿名对象是内部的,因此您还需要让您的对象对您的测试项目可见。在包含 ValuesController 类的项目的 AssemblyInfo.cs 文件中,添加

[assembly: InternalsVisibleTo("YourProjectName.UnitTestProject1")]

关于c# - 解析来自 API 的动态 jsonResult 响应给出 "object does not contain definition for X",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684016/

相关文章:

c# - 如何在 DataSet C# 中连接多个表

c# - List<T> 需要 '1' 类型参数

c# - 如何使用嵌入资源的 DLL 加载?

asp.net - 通过 SendGrid 向 Outlook 发送邮件总是失败

reporting-services - ASP.NET 5 MVC 6 中会有 SSRS 报表查看器吗?

c# - asp.net 5/mvc 6 中的 PushStreamContent 不工作

javascript - JavaScriptSerializer 期间 ASP.NET MVC AngularJS 中的 MaxJsonLength 异常

asp.net-mvc - NLog.Extended未复制到我的Web项目

c# - 如何在数据库中保存一个特定值

asp.net-core - ASP.NET Core Web 应用程序控制台立即关闭