“动态”关键字和JSON数据

时间:2011-01-06 11:22:15

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

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

我试过了:

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

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

但是,当我在第2行放置一个断点并检查json动态变量(见下图)时,显然 包含ErrorLevel字符串并且它具有预期值,因此如果运行时粘合剂没有玩得有趣,测试会通过。

Snapshot of the Locals debugger window

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

2 个答案:

答案 0 :(得分:15)

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

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有用。

答案 1 :(得分:2)

Data的{​​{1}}属性属于JsonResult类型,这意味着,虽然您有动态声明,但设置的类型仍为Object。另一个问题是您使用匿名类型作为Object,然后尝试将其作为其适用范围之外的声明实例进行访问。使用@ Darin的技术使用Data访问属性值。