Si tengo un controlador de la siguiente manera:¿Cómo se prueba un método de acción que devuelve 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);
}
Básicamente, tomo cosas de mi repositorio, y luego proyectarlo en un List<T>
de tipos anónimos.
¿Cómo puedo probar la unidad?
tiene una propiedad llamada Data
, pero es del tipo object
, como esperábamos.
¿Significa eso que si quiero probar que el objeto JSON tiene las propiedades que espero ("id", "nombre", "tipo"), tengo que usar la reflexión?
EDIT:
Aquí está mi prueba:
// 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.");
}
pero me da un error de ejecución en el bucle, indicando "objeto no contiene una definición para id".
Cuando breakpoint, actionResult.Data
se define como List<T>
de tipos anónimos, por lo que creo que si enumero a través de estos, puedo verificar las propiedades. Dentro del ciclo, el objeto tiene tiene una propiedad llamada "id", por lo que no está seguro de cuál es el problema.
Re la edición - podría intentar algo así como var items = (IEnumerable) actionResult.Data; foreach (obj dinámico en elementos) {...} –
He probado aquí con ' var list = (IList) datos; Assert.AreEqual (list.Count, 2); obj dinámico = datos [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 dinámico en la lista) { if (d.id == null) throw new InvalidOperationException(); } 'y parecía estar bien ... –
déjame probar ese código mañana cuando llegue a la oficina. aclamaciones. – RPM1984