如果我有一个这样的控制器:如何对返回JsonResult的Action方法进行单元测试?
[HttpPost]
public JsonResult FindStuff(string query)
{
var results = _repo.GetStuff(query);
var jsonResult = results.Select(x => new
{
id = x.Id,
name = x.Foo,
type = x.Bar
}).ToList();
return Json(jsonResult);
}
基本上,我抢东西从我的资料库,然后投射成匿名类型的List<T>
。
我该如何进行单元测试?
System.Web.Mvc.JsonResult
有一个名为Data
的属性,但它的类型为object
,正如我们所预期的那样。那么这是否意味着如果我想测试JSON对象具有我期望的属性(“id”,“name”,“type”),我必须使用反射吗?
编辑:
这里是我的测试:
// Arrange.
const string autoCompleteQuery = "soho";
// Act.
var actionResult = _controller.FindLocations(autoCompleteQuery);
// Assert.
Assert.IsNotNull(actionResult, "No ActionResult returned from action method.");
dynamic jsonCollection = actionResult.Data;
foreach (dynamic json in jsonCollection)
{
Assert.IsNotNull(json.id,
"JSON record does not contain \"id\" required property.");
Assert.IsNotNull(json.name,
"JSON record does not contain \"name\" required property.");
Assert.IsNotNull(json.type,
"JSON record does not contain \"type\" required property.");
}
但我得到一个运行时错误的循环,指出“对象不包含一个定义ID”。
当我断点时,actionResult.Data
被定义为一个匿名类型的List<T>
,所以我想如果我通过这些枚举,我可以检查属性。在循环内部,对象确实有有一个叫做“id”的属性 - 所以不知道问题是什么。
重新编辑 - 你可以尝试像var items =(IEnumerable)actionResult.Data; foreach(动态obj中的项目){...} – 2011-02-14 22:57:05
我已经在这里测试了' var list =(IList)数据; Assert.AreEqual(list.Count,2); dynamic obj = data [0]; Assert.AreEqual(obj.id,12); Assert.AreEqual(obj.name,“Fred”); Assert.AreEqual(obj.type,'a'); obj = data [1]; Assert.AreEqual(obj.id,14); Assert.AreEqual(obj.name,“Jim”); Assert.AreEqual(obj.type,'c'); foreach(动态列表中的d) if(d.id == null)throw new InvalidOperationException(); }`看起来很好...... – 2011-02-15 06:11:16