2013-02-02 25 views
3

我想单元测试一个ASP.NET MVC 4控制器返回Kendo.UI.Mvc DataSource结果包装为Json。问题是我无法到达返回的实际数据..它始终为空。单元测试与Kendo的ASP.NET MVC4控制器

问题是,我如何验证从包装Kendo.UI DataSourceResult的控制器返回的JSON。

回答

5

这个问题令人生气,因为我可以在调试时看到VS想要的数据集合。我更新了测试夹具 - 在模型数据上可以执行断言。

基本上我做了以下内容:

  1. 投下的ActionResult作为JsonResult
  2. 使用动态类型,得到其返回Kendo.Mvc.UI.DataSourceResult的JsonResult “数据”。在使用动态类型之前,只返回null。 (注意自我,详细了解动态类型)
  3. 将来自步骤2的结果作为要测试的数据类型进行投射。

控制器:

public ActionResult EditRead([DataSourceRequest] DataSourceRequest request) 
    {  
     return Json(GetViewModel().ToDataSourceResult(request));   
    } 

单元测试:

[Test] 
    public void EditRead_Should_Read_List_Or_Pharmacies() 
    { 
     //Create test db 
     var db = new FakePharmacyDirectoryDb(); 
     db.AddSet(TestData.PharmacyLocations(10)); 

     //setup controller, we need to mock a DataSourceRequest 
     //that Kendo.Mvc uses to communicate with the View 
     var controller = new DirectoryController(db); 
     var kendoDataRequest = new DataSourceRequest(); 

     //get the result back from the controller 
     var controllerResult = controller.EditRead(kendoDataRequest); 

     //cast the results to Json 
     var jsonResult = controllerResult as JsonResult; 

     //at runtime, jsonRsult.Data data will return variable of type Kendo.Mvc.UI.DataSourceResult 
     dynamic kendoResultData = jsonResult.Data; 

     //... which you can then cast DataSourceResult.Data as 
     //the return type you are trying to test 
     var results = kendoResultData.Data as List<PharmacyLocation>; 

     Assert.IsInstanceOf<List<PharmacyLocation>>(results); 
     Assert.AreEqual(10,results.Count); 
    }