Как выполнить модульное тестирование метода действия, который возвращает JsonResult?

Если у меня есть такой контроллер:

[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);
}

Обычно я беру материал из своего репозитория, а затем проецирую его в Список анонимных типов.

Как я могу его протестировать?

System.Web.Mvc.JsonResult имеет свойство под названием Data , но он имеет тип объект , как мы и ожидали.

Означает ли это, что если я хочу проверить, что объект 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 анонимных типов, поэтому я полагаю, что если я перечисляю их, я могу проверить свойства. Внутри цикла объект действительно имеет свойство под названием «id», поэтому не уверен, в чем проблема.

42
задан SteveC 30 September 2013 в 14:16
поделиться