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

Как проводить модульное тестирование метод действия, который возвращает 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); } 

В основном, я беру вещи из моего репозитория, то проект его в List<T> анонимных типов.

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

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

Это значит, что если я хочу проверить, что json-объект имеет свойства, которые я ожидал (“идентификатор”, “имя”, “Тип”), я должен использовать отражение?

Редактировать:

Вот мой тест:

// 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."); } 

Но я получаю ошибки во время выполнения в цикле, заявив, что “объект не содержит определения для ИД”.

Когда я точку останова, actionResult.Data определяется как List<T> анонимных типов, так что если мне перечислять, я могу проверить свойства. Внутри цикла объекта не имеют свойство с именем “идентификатор” – значит не уверен в чем проблема.

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

  1. Я выражаю решения от Мэтта Грира и придумали это небольшое расширение:

        public static JsonResult IsJson(this ActionResult result)     {         Assert.IsInstanceOf<JsonResult>(result);         return (JsonResult) result;     }      public static JsonResult WithModel(this JsonResult result, object model)     {         var props = model.GetType().GetProperties();         foreach (var prop in props)         {             var mv = model.GetReflectedProperty(prop.Name);             var expected = result.Data.GetReflectedProperty(prop.Name);             Assert.AreEqual(expected, mv);         }         return result;     } 

    И я просто запустите unittest следующим образом: – установить результат ожидаемый набор данных:

            var expected = new         {             Success = false,             Message = "Name is required"         }; 

    – Утверждать результаты:

            // Assert         result.IsJson().WithModel(expected); 

Comments are closed.