使用Kendo对ASP.NET MVC4控制器进行单元测试

Mik*_*keB 3 nunit asp.net-mvc-4 kendo-ui

我正在尝试单元测试一个ASP.NET MVC 4控制器,它返回包含为Json的Kendo.UI.Mvc DataSource结果.问题是我无法获得返回的实际数据..它始终为null.

问题是,如何验证从包装Kendo.UI DataSourceResult的Controller返回的JSON.

Mik*_*keB 6

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

基本上我做了以下事情:

  1. 将ActionResult强制转换为JsonResult
  2. 使用动态类型,从JsonResult获取返回Kendo.Mvc.UI.DataSourceResult的"数据".在使用动态类型之前,仅返回null.(注意自我,了解有关动态类型的更多信息)
  3. 将step2的结果转换为要测试的数据类型.

控制器:

    public ActionResult EditRead([DataSourceRequest] DataSourceRequest request)
    {      
        return Json(GetViewModel().ToDataSourceResult(request));           
    }
Run Code Online (Sandbox Code Playgroud)

单元测试:

    [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);
    }
Run Code Online (Sandbox Code Playgroud)