asp.net mvc 自动化测试工具

好久不写文章了,一直忙在项目中。

前一阵发现公司一个项目,体积巨大。业务很复杂。基于历史原因,项目基于mvc 2迁移过来,视图大多还是aspx  作为视图承载。

控制器中的方法  更是一个比一个多。

由于站点使用了许多开源组件,整个Bin  编译出来有将近200M!

而且里面在站点启动的时候,对远程的服务代码 进行了动态编译!导致启动一次项目很慢,调试很麻烦 等待很久,很是捉急...........

想测试个控制器的Action ,要么写代码测试,要么有HttpContext的那种 只能干等待。于是想了想,要是有能自动模拟 iis的测试工具,直接监视请求,然后调试源码。

实现原理:

基于 Owin的  Mvc 自承载。

mvc项目自承载,一个基于Owin的命令行程序,在启动的时候,Startup 中,host mvc 站点项目即可。然后就可以模拟Iis 承载mvc ,启动迅速,也不用写单元测试代码,对于复杂的

参数,也不用代码构建了。

一个比较头大的问题是:自承载的处理模型跟 iis 承载的处理模型不一样。

Owing是基于 模块组件的方式,构成调用链。对注册的中间件进行链式的调用,全程使用一个OwinContenxt 

IIs 是基于管道模型,将请求 封装到 HttpConxt 中,然后基于事件的形式 在 注册的Module Handler中穿梭。

要进行模拟IIS 就必须模拟HttpContext对象!!!(除非  项目完全抛弃了使用这个对象----0-0--)

 

如何模拟?不好模拟,因为微软团队将这个对象的很多属性 /字段 要么 是只读的 要么是私有的。所以,只能不走寻常路:反射赋值!!!

比如:

核心代码: SimpleWorkerRequest 

提供的简单实现 HttpWorkerRequest 抽象类可以使用 Internet 信息服务 (IIS) 应用程序外部托管 ASP.NET 应用程序。 您可以采用SimpleWorkerRequest 直接或对其进行扩展。

通过 SimpleWorkerRequest 构建HttpContext 对象

然后通过反射,对非公开的字段/只读属性进行赋值

Type appFactoryType = Type.GetType("System.Web.HttpApplicationFactory, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
            object appFactory = ReflectionHelper.GetStaticFieldValue<object>("_theApplicationFactory", appFactoryType);
            ReflectionHelper.SetPrivateInstanceFieldValue("_state", appFactory, HttpContext.Current.Application);
        }

要加载那些dll 中的代码,就构建加载对应的Type  然后 反射赋值即可!

 

一旦能承载,那么 接下来无非就是对Mvc 的请求解析。。。(owin 自承载可以自动解析webapi的控制器,所以 对于混合项目 或者mvc项目,将mvc解析请求的基本步骤实现即可)

复制代码
 1  var controllerOfMvc = Activator.CreateInstance(controllerDescription.ControllerType) as Controller;
 2 
 3                             IHttpRouteData routeData = GlobalContext.config.Routes.GetRouteData(requestMessage);
 4                             var mvcRouteData = new RouteData();
 5                             var paras = new Dictionary<string, object>();
 6                             foreach (var item in routeData.Values)
 7                             {
 8                                 mvcRouteData.Values.Add(item.Key, item.Value);
 9                                 paras.Add(item.Key, item.Value);
10                             }
11                             var ctrlContext = new ControllerContext(httpContextBase, mvcRouteData, controllerOfMvc);
12                             var actionDescription = controllerDescription.FindAction(ctrlContext, actionName);
13 
14                             if (null != actionDescription)
15                             {
16                                 var actionResult = actionDescription.Execute(ctrlContext, paras) as ActionResult;
17 
18                                 string resultText = string.Empty;
19                                 if (actionResult is JsonResult)
20                                 {
21                                     var data = (actionResult as JsonResult).Data;
22                                     resultText = JsonConvert.SerializeObject(data);//序列化数据
23 
24                                 }
25                                 else if (actionResult is ViewResult || actionResult is PartialViewResult)
26                                 {
27                                     //解析模板  实现的核心就是  视图文件虚拟化 VirtualPathProvider and 动态编译   var clientBuildManager = new ClientBuildManager(rootVirtualPath, GlobalContext.SitePhysicDir);
28                                     /*
29                                      如果  有需要  可以尝试开发出来。参考资料:
30                                      http://blog.rebuildall.net/2009/11/17/asp_net_mvc_and_virtual_views
31                                      https://blog.falafel.com/how-to-load-views-from-assembly-in-mvc/
32                                      https://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider(v=vs.110).aspx
33                                      http://www.binaryintellect.net/articles/e544d1d3-e47e-4ced-bd4d-8c1eaefbdc31.aspx
34                                      http://www.danielroot.info/2013/07/reuse-mvc-views-using-virtual-path.html
35                                      https://github.com/aspnet/Mvc/issues/3750
36                                      http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/
37                                      https://stackoverflow.com/questions/236972/using-virtualpathprovider-to-load-asp-net-mvc-views-from-dlls
38                                      https://stackoverflow.com/questions/24341336/is-it-possible-to-access-mvc-views-located-in-another-project
39                                      http://ericsowell.com/blog/2007/4/3/the-asp-net-virtual-path-provider-an-example-implementation
40                                      http://tech.trailmax.info/2014/02/attempt-to-do-view-compilation-for-azure-web-role/
41                                      http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/BuildManagerCompiledView.cs
42                                      http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/BuildManagerCompiledView.cs
43                                     */
44                                     throw new NotImplementedException();
45 
46                                     string viewName = RenderHelper.ViewNameFromActionResult(actionResult);
47                                     if (string.IsNullOrEmpty(viewName))
48                                     {
49                                         viewName = actionName;
50                                     }
51                                     //定制 路径 不基于mvc标准
52                                     string viewPath = System.IO.Path.Combine( "~/Views", controllerName, string.Concat(actionName, ".aspx")).Replace("\\","/");//暂时没有ascx
53                                    //
54                                     resultText = RenderHelper.RenderWebFormViewToString(ctrlContext, actionResult, viewPath);//RenderHelper.RenderActionResultToString(ctrlContext, actionResult, mvcRouteData, controllerOfMvc);
55 
56                                 }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
之前在一家公司里用过Knockout,是easyui 和 Knockout结合 的。下面的这本应该不错。 目录 前言 第一部分入门指南 第1章MVC介绍 创建第一个项目 分析HomeController 分析View 理解URL结构 小结 第2章Bootstrap介绍 默认菜单 含有下拉列表和搜索框的菜单 按钮 警告框 主题 小结 第3章Knockout.js介绍 安装Knockout.js 基本示例 何为MVVM? 创建ViewModel 小结 第4章数据库应用 Entity Framework介绍 Code First Database First 创建测试数据 小结 第二部分数据处理 第5章表的查询、排序、分页 Author查询 Author排序 Author分页 小结 第6章表单处理 在表单中集成Knockout 共享View和ViewModel 在模态框中进行删除操作 空表格 小结 第7章服务器端ViewModel 为什么要创建服务器端ViewModel? AuthorViewModel 更新Authors列表 更新Add/Edit表单 更新Delete模态框 小结 第8章Web API介绍 安装Web API 更新Authors列表 更新Authors的Add/Edit表单 小结 第三部分代码架构 第9章创建全局过滤器 Authentication过滤器 Authorization过滤器 Action过滤器 Result过滤器 Exception过滤器 Web API全局验证 用Result过滤器进行自动映射 Web API错误处理 MVC错误处理 小结 第10章添加验证与授权 Authentication概述 Authorization概述 实现一个Authentication过滤器 实现一个Authorization过滤器 小结 第11章使用Attribute定义URL路由 Attribute路由基础知识 路由前缀 路由约束 小结 第12章胖模型、瘦控制器 关注点分离 服务与行为 小结 第四部分应用实例 第13章构建购物车 购物车需求 购物车项目 JavaScript捆绑与最小化 小结 第14章构建数据模型 Code—First模型 定义DbContext并初始化数据 视图模型 小结 第15章布局实现 共享布局 购物车摘要 分类菜单 小结 第16章图书列表 主页 特色图书 按分类筛选图书 小结 第17章添加购物车 图书详情 自定义组件和自定义绑定 保存购物车项 小结 第18章更新或删除购物车 购物车详情 购物车详情上的Knockout应用 完成购物车
作者简介 Jess Chadwick 专注于Web技术领域,独立软件技术顾问。超过10年的软件开发经验,就职的公司包括嵌入式设备创业公司、世界500强。ASPInsider、微软ASP.NET 领域的MVP。经常在新泽西的NJDOTNET做技术讲座。 Todd Snyder超过18年软件开发经验。微软平台的企业级系统架构提供技术咨询和开发指导。就职于美国 Infragistics公司,经常作为讲师受邀参加各种技术会议。 Hrusikesh Panda:架构师、RIA专家、Web架构师以及开源爱好者。 目录 第1章:ASP.NET MVC基础 第2章:ASP.NET Web Form开发人员必读 第3章:使用数据 第4章:客户端开发 第5章:Web应用程序架构 第6章:使用AJAX提升网站体验 第7章:ASP.NET Web API 第8章:高级数据 第9章:安全 第10章:移动Web网站开发 第11章:并行计算、异步和实时数据操作 第12章:缓存 第13章:客户端优化技术 第14章:高级路由 第15章:可复用UI组件 第16章:日志 第17章:自动测试 第18章:自动化生成 第19章:部署 附录A ASP.NET MVC与Web Form集成 附录B 作为平台使用NuGet 附录C ASP.NET MVC开发最佳实践原则 附录D 交叉引用:目标主题、特性和场景 索引 内容简介 本书介绍了微软最新的ASP.NET MVC 4框架,包括如何使用ASP.NET MVC 4框架构建Web应用程序,ASP.NET MVC 4框架的运行原理,如何在真实开发场景中使用ASP.NET MVC 4框架新特性来解决不同的需求,如何使用HTML、JavaScript、Entity Framework以及其他Web相关的技术。同时,分享了许多实际项目开发的最佳实践经验,包括如何使用jQery、jQuery、Entity Framework、ASP.NET Web API进行应用程序开发。而且还深入阐述了许多高级知识点,如网站SEO、性能优化、日志、缓存等。 对于想要学习ASP.NET MVC Web编程的开发人员来说,本书无疑是最佳选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值