2013-09-26 4 views
4

Итак, у меня есть контроллер, который возвращает json в мои представления, которые мне нужно проверить. Я попытался использовать отражение с динамическим типом данных, чтобы получить доступ к вспомогательному свойству списка, но я все-таки получаю нечто похожее на ошибки «неспособности». В основном у меня есть список в списке, который я хочу получить и проверить, но я не могу получить к нему доступ. Кто-нибудь тестировал json, возвращенный со своего контроллера, прежде чем в MVC4 и получил совет?Тестирование результатов JSON от контроллера MVC 4 C#

Код:

// arrange 
     var repositoryMock = new Mock<IEdwConsoleRepository>(); 
     var date = -1; 
     var fromDate = DateTime.Today.AddDays(date); 
     EtlTableHistory[] tableHistories = 
      { 
       new EtlTableHistory 
        { 
         Table = new Table(), 
         RelatedStatus = new BatchStatus(), 
         BatchId = 1 
        } 
      }; 
     EtlBatchHistory[] batchHistories = { new EtlBatchHistory 
              { 
               Status = new BatchStatus(), 
               TableHistories = tableHistories 
              } }; 

     repositoryMock.Setup(repository => repository.GetBatchHistories(fromDate)).Returns((IEnumerable<EtlBatchHistory>)batchHistories); 
     var controller = new EdwController(new Mock<IEdwSecurityService>().Object, repositoryMock.Object); 

     // act 
     ActionResult result = controller.BatchHistories(1); 

     // assert 
     Assert.IsInstanceOfType(result, typeof(JsonResult), "Result type was incorrect"); 
     var jsonResult = (JsonResult)result; 
     var resultData = (dynamic)jsonResult.Data; 
     var returnedHistories = resultData.GetType().GetProperty("batchHistories").GetValue(resultData, null); 

     var returnedTableHistoriesType = returnedHistories.GetType(); 
     Assert.AreEqual(1, returnedTableHistoriesType.GetProperty("Count").GetValue(returnedHistories, null), "Wrong number of logs in result data"); 
+0

Я хочу получить свойство «TableHistories» из объекта EtlBatchHistory внутри batchHistories. – noname

+0

Как выглядит ваш JSON и/или какой код его производит? И вы должны просто использовать 'var returnHistories = resultData.batchHistories;', без рефлексии (для этого используется 'dynamic'). (тот же для свойства 'Count') –

+0

Json выглядит так:« {batchHistories = System.Collections.Generic.List'1 [<> f__AnonymousType1'11 [System.Int32, System.String, System.String, System.String, System.Int32, System.Nullable'1 [System.Int64], System.Nullable'1 [System.Int32], System.String, System.String, System.String, System.Collections.Generic.List'1 [<> f__AnonymousType0'9 [System.String, System.String, System.Int32, System.Int32, System.String, System.String, System.String, System.String, System.String]]]]} " – noname

ответ

0

Вы можете десериализации ваш JSon в динамический объект, а затем задать для свойства вы хотите

Пример:

dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); 

var propertyValue = obj.MyProperty; //Ask for the right property 

Вы можете добавить JSon сериалайзер из NuGet Пакет Json.Net.

+0

Я не могу использовать newtonsoft в actionresult, хотя это то, что возвращает мой контроллер. я думаю, я должен был уточнить лучше. – noname

+0

Хорошо, я понимаю, что теперь я понимаю ваш пост. Возможно, у вас что-то не так в json, каково содержание jsonResult.Data? Вы получите json-строку, выполняющую JsonConvert.SerializeObject (jsonResult.Data) –

+0

проверить мой комментарий к оригинальному сообщению, для которого выглядит json, спасибо за вашу помощь! – noname

3

Вот пример:

Controller: 

    [HttpPost] 
    public JsonResult AddNewImage(string buildingID, string desc) 
    { 
     ReturnArgs r = new ReturnArgs(); 

     if (Request.Files.Count == 0) 
     { 
      r.Status = 102; 
      r.Message = "Oops! That image did not seem to make it!"; 
      return Json(r); 
     } 
     if (!repo.BuildingExists(buildingID)) 
     { 
      r.Status = 101; 
      r.Message = "Oops! That building can't be found!"; 
      return Json(r); 
     } 

     SaveImages(buildingID, desc); 
     r.Status = 200; 
     r.Message = repo.GetBuildingByID(buildingID).images.Last().ImageID; 

     return Json(r); 
    } 

    public class ReturnArgs 
    { 
     public int Status { get; set; } 
     public string Message { get; set; } 
    } 

Test: 

    [TestMethod] 
    public void AddNewImage_Returns_Error_On_No_File() 
    { 
     // Arrange 
     ExtendedBuilding bld = repo.GetBuildings()[0]; 
     string ID = bld.Id; 

     var fakeContext = new Mock<HttpContextBase>(); 
     var fakeRequest = new Mock<HttpRequestBase>(); 

     fakeContext.Setup(cont => cont.Request).Returns(fakeRequest.Object); 
     fakeRequest.Setup(req => req.Files.Count).Returns(0); 

     BuildingController noFileController = new BuildingController(repo); 
     noFileController.ControllerContext = new ControllerContext(fakeContext.Object, new System.Web.Routing.RouteData(), noFileController); 

     // Act 
     var result = noFileController.AddNewImage(ID, "empty"); 

     ReturnArgs data = (ReturnArgs)(result as JsonResult).Data; 

     // Assert 
     Assert.IsTrue(data.Status == 102); 
    } 

В вашем примере он смотрит на меня, что проблема здесь:

var resultData = (dynamic)jsonResult.Data; 
var returnedHistories = resultData.GetType().GetProperty("batchHistories").GetValue(resultData, null); 

Объект resultData бы точный тип объекта, который вы вернулись в ваше действие. Так что если вы сделали что-то вроде:

List<String> list = repo.GetList(); 
return Json(list); 

Тогда ваш resultData будет иметь тип:

List<String> 

Попробуйте убедиться, что вы возвращаете свой объект с помощью функции Json (объект).

+0

благодарит за сообщение!Я в настоящее время использую функцию Json (obj), из моего контроллера я возвращаю объект ActionResult, который является System.Web.Mvc.JsonResult (может быть, неверен в этой области имен, но что-то близкое к этому), после использования отражения я получаю свойство batchHistories из того, что является анонимным списком объектов BatchHistory. в том, что это еще один анонимный список, но я не могу получить доступ либо с отражением, и по какой-то причине я могу десериализовать его. – noname

+0

Нет проблем. Вы пробовали сильно набирать возвращаемый объект, а затем распаковывали jsonResult.Data как этот тип в вашем тесте? На другой ноте, не уверен, почему отражение не работает! – anthr

Смежные вопросы