"动态"关键字和JSON数据

Pet*_*háč 8 c# json unit-testing dynamic asp.net-mvc-2

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

我试过这个:

1. dynamic json = ((JsonResult)myActionResult).Data;
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel);
Run Code Online (Sandbox Code Playgroud)

但我得到一个RuntimeBinderException"'对象'不包含'ErrorLevel'的定义".

然而,当我把第2行断点和检查JSON动态变量(见下图),这显然包含的ErrorLevel字符串,它的预期值,因此,如果运行时绑定是不是在玩有趣的测试将通过.

Locals调试器窗口的快照

我得不到什么?我做错了什么,我该如何解决这个问题?如何让断言通过?

Dar*_*rov 15

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

public ActionResult Index()
{
    return Json(new { Id = 5, Foo = "bar" });
}
Run Code Online (Sandbox Code Playgroud)

和相应的测试:

// act
var actual = subjectUnderTest.Index();

// assert
var data = new RouteValueDictionary(actual.Data);
Assert.AreEqual(5, data["Id"]);
Assert.AreEqual("bar", data["Foo"]);
Run Code Online (Sandbox Code Playgroud)

您也可能会发现以下博客文章很有用.

  • 这是工作.我很欣赏它是如何工作的但仍然看起来很糟糕.使用RouteValueDictionary查询匿名对象的内容非常违反直觉......我只能希望记住这个解决方案,因为我不认为我会自己想出这个.是不是有一个不同的类会使用匿名对象执行相同的操作,而不是隐藏在System.Web.dll中的东西?(奇怪的是它存在于System.Web.Routing命名空间中,但不在System.Web.Routing.dll中) (3认同)