我的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字符串并且它具有预期值,因此如果运行时粘合剂没有玩得有趣,测试会通过。
我没有得到什么?我做错了什么,我该如何解决这个问题?如何使断言通过?
答案 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
访问属性值。