【问题标题】:"dynamic" keyword and JSON data“动态”关键字和 JSON 数据
【发布时间】:2011-06-04 14:26:02
【问题描述】:

我的 ASP.NET MVC2 应用程序中的一个操作方法返回一个 JsonResult 对象,在我的单元测试中,我想检查返回的 JSON 对象是否确实包含预期值。

我试过了:

1. dynamic json = ((JsonResult)myActionResult).Data;
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel);

但我得到一个 RuntimeBinderException“'object' 不包含 'ErrorLevel' 的定义”。

但是,当我在第 2 行放置断点并检查 json 动态变量(见下图)时,它显然 确实 包含 ErrorLevel 字符串并且它具有预期值,所以如果运行时活页夹玩得不好笑,测试会通过。

我没有得到什么?我做错了什么,我该如何解决?如何使断言通过?

【问题讨论】:

    标签: c# unit-testing json asp.net-mvc-2 dynamic


    【解决方案1】:

    你真的不需要动态。这是一个例子。假设您想要对以下操作进行单元测试:

    public ActionResult Index()
    {
        return Json(new { Id = 5, Foo = "bar" });
    }
    

    以及相应的测试:

    // act
    var actual = subjectUnderTest.Index();
    
    // assert
    var data = new RouteValueDictionary(actual.Data);
    Assert.AreEqual(5, data["Id"]);
    Assert.AreEqual("bar", data["Foo"]);
    

    您可能会发现following blog post 很有用。

    【讨论】:

    • 正在工作。我很欣赏它是如何工作的,但看起来仍然像一个黑客。使用 RouteValueDictionary 查询匿名对象的内容非常违反直觉……我只能希望记住这个解决方案,因为我不认为我会自己想出这个。是不是有一个不同的类可以对匿名对象做同样的事情,在 System.Web.dll 中没有隐藏的东西? (奇怪的是它存在于 System.Web.Routing 命名空间中,但不在 System.Web.Routing.dll 中)
    【解决方案2】:

    JsonResultData 属性属于Object 类型,这意味着,尽管您有动态声明,但设置的类型仍然是Object。另一个问题是您使用匿名类型作为Data,然后尝试将其作为适用范围之外的声明实例访问。使用@Darin 的技术通过RouteValueDictionary 访问属性值。

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 2020-10-10
      • 2021-11-02
      • 2021-03-02
      • 2020-05-07
      • 2019-07-21
      • 2011-09-17
      • 2011-07-28
      • 2011-01-31
      相关资源
      最近更新 更多