Если у меня есть такой контроллер:
[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», поэтому не уверен, в чем проблема.