【问题标题】:Unit Testing ASP.NET MVC4 Controller with Kendo使用 Kendo 对 ASP.NET MVC4 控制器进行单元测试
【发布时间】:2013-02-02 23:58:00
【问题描述】:

我正在尝试对一个 ASP.NET MVC 4 控制器进行单元测试,该控制器返回包装为 Json 的 Kendo.UI.Mvc 数据源结果。问题是我无法获取返回的实际数据.. 它始终为空。

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

【问题讨论】:

    标签: asp.net-mvc-4 nunit kendo-ui


    【解决方案1】:

    这个问题令人恼火,因为我在调试时可以在 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);
        }
    

    【讨论】:

    • 请问如何获得这个? var db = new FakePharmacyDirectoryDb(); db.AddSet(TestData.PharmacyLocations(10));
    • 干得好!但我会使用var kendoResultData = jsonResult.Data as DataSourceResult; 而不是dynamic
    猜你喜欢
    • 2013-06-15
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多