如果我有一個這樣的控制器:如何對返回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