最近项目中需要修改一个文件上传的.ashx处理,代码的大概形式是这样的:

public void ProcessRequest(HttpContext context)
{CallA(context);
}

方法CallA中直接使用了context并做了很多业务判断,也没有时间重构此方法,因此想对修改的代码做单元测试,

就需要Mock或实例化context参数。
     提示:我们开发环境为vs2010,mock组件为moq,当然有条件使用moles或是mvc的情况下,做这个单元测试还是比较容易的

由于HttpContext是密封类,Moq就显得无力了,那就只有自己实例化了,从网上发现了有个帮助类,心中暗喜

https://svn.re-motion.org/svn/Remotion/branches/1.8/Web/UnitTests/AspNetFramework/HttpContextHelper.cs

在此感谢作者的无私的贡献。直到使用后发现一个问题,这个帮助类只支持对querystring,form,session的赋值,

而项目中却需要对context.Request.ServerVariables和context.Request.Files赋值(文件上传嘛,你懂的),

于是作为码农的我就开始堆代码了

下面是设置服务端参数的函数的实现:

        public static void SetServerVar(HttpContext context, NameValueCollection vars){System.Collections.Hashtable hash = new System.Collections.Hashtable();Type entryType = typeof(System.Collections.Specialized.NameObjectCollectionBase).GetMethod("FindEntry", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).ReturnType;Type p = typeof(System.Web.HttpApplication).Assembly.GetType("System.Web.HttpServerVarsCollectionEntry");foreach (string key in vars){var httpServerVarsCollectionEntry = PrivateInvoke.CreateInstanceNonPublicCtor(p, new object[] { key, vars[key] });var entry = PrivateInvoke.CreateInstanceNonPublicCtor(entryType, new object[] { key, httpServerVarsCollectionEntry });hash[key] = entry;}PrivateInvoke.SetNonPublicField(context.Request.ServerVariables, "_entriesTable", hash);PrivateInvoke.SetNonPublicField(context.Request.ServerVariables, "_allKeys", new string[] { "server_name" });}

下面是设置上传文件的代码:

        public static void SetFile(HttpContext context, string formName, string contentType, string fileName, byte[] file){Type httpInputStream = typeof(HttpPostedFile).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0].GetParameters()[2].ParameterType;Type httpRawUploadedContent = httpInputStream.GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0].GetParameters()[0].ParameterType;var row = PrivateInvoke.CreateInstanceNonPublicCtor(httpRawUploadedContent, new object[] { file.Length, file.Length });PrivateInvoke.SetNonPublicField(row, "_data", file);PrivateInvoke.SetNonPublicField(row, "_length", file.Length);PrivateInvoke.SetNonPublicField(row, "_completed", true);var stream = PrivateInvoke.CreateInstanceNonPublicCtor(httpInputStream, new object[] { row, 0, file.Length });HttpPostedFile f = (HttpPostedFile)PrivateInvoke.CreateInstanceNonPublicCtor(typeof(HttpPostedFile), new object[] { fileName, contentType, stream });PrivateInvoke.InvokeNonPublicMethod(context.Request.Files, "AddFile", new object[] { formName, f });}

代码我就不解释了,没什么技术含量。在此建议在写函数时尽量减少依赖性,如上面的CallA方法传入的是业务参数,也就没有这些问题了

最后,附上源码及demo,猛击我下载

转载于:https://www.cnblogs.com/luanfei/p/3269942.html

.ashx接口单元测试相关推荐

  1. ashx 接口调用_51.Qt-使用ajax获取ashx接口的post数据

    由于当前C++项目需要使用ajax库去post调用ashx接口,接口地址如下所示: 需要传递的参数如下: 然后发现qml比较好调用ajax.js库,所以本章通过C++界面去获取qml方法来实现调用as ...

  2. java 接口单元测试_单元测试

    1. 单元测试 1.1. 为什么要做单元测试 帮助理解需求 单元测试应该反映使用场景,把被测单元当成黑盒测试其外部行为. 提高实现质量 单元测试不保证程序做正确的事,但能帮助保证程序正确地做事,从而提 ...

  3. ashx 接口调用_使用ajax去请求调用ashx的接口

    首先要明白这个是前台去请求后台的接口,把前台的参数传给后台,然后后台给前台一个或多个返回结果. 1.后台的代码如下: /// /// GetInfomationDetail 的摘要说明 /// pub ...

  4. ashx 接口调用_[ASP.Net ]利用ashx搭建简易接口

    转载:https://blog.csdn.net/ZYD45/article/details/79939475 创建接口的方式有很多,像是Web api,nodejs等等 今天,主要介绍,利用ashx ...

  5. android 接口单元测试,Android单元测试和接口

    原来,问题是活动必须在实际的测试方法中得到.因此,例如,我的方法现在看起来像这样: public void testGetActivityResourceString() { Activity myA ...

  6. Java单元测试--如何编写Controler接口的单元测试

    在UTDD的流程中,通常会从上到下进行模拟,流程如下: Controller接口单元测试 –>Controller接口代码实现 –>Api接口单元测试 –>Api接口代码实现 那么我 ...

  7. 芝麻翻译软件测试,细数35个单元测试准则 “Hello, world!”

    1.保持单元测试小巧.快速 理论上,任何代码提交前都应该完整跑一遍全部测试套件.保持测试代码执行符合预期,这样可以缩短迭代开发周期.程序员 2.单元测试应该是全自动/非交互式的 测试套件一般是按期执行 ...

  8. 从功能到接口,原来技能可以通用!

    接口业务安全测试 业务安全测试是根据业务需求,针对业务安全规则展开的系统功能测试.业务安全测试作为在系统功能测试的重要组成部分,在接口测试过程中同样适用. 区别于系统漏洞扫描.SQL注入防范等技术安全 ...

  9. junit可执行但控制层无法执行_springboot项目controller接口junit测试

    原创不易,请多多支持!对软件技术感兴趣的童鞋请关注我,后续技术分享更精彩. 背景 springboot项目,有时需要对工程中的controller接口单元测试,而不仅仅只是service/dao层,在 ...

最新文章

  1. device not ready cuda
  2. 无人值守数据中心这一次真的能“大势所趋”吗?
  3. Mybatis 总结
  4. 图像传感器之CMOS(2)
  5. 如何修改Git仓库的URL(地址)
  6. 依次将10个数输入,要求打印出其中最大的数
  7. 在Windows上删除所有的Oracle安装 和电脑名改变后的设置...
  8. 曲速未来 揭示:发现假EOS钱包窃取用户资金
  9. Unity 编辑器扩展教程
  10. 中文命名实体识别总结
  11. You tube music
  12. Nodejs+MongoDB+WebRTC搭建视频通话协同应用
  13. 瑞星4月2日安全综述:网页挂马攻击严重
  14. RGB-D相机(Azure Kinect DK)SDK安装
  15. 怎么在小程序里开店铺?【小程序开店】
  16. IDEA项目包的导入以及压缩包的快速导出
  17. 从FrameDebugger看Unity渲染
  18. 汽车软件大战一触即发,诚迈科技如何重构整车“软架构”
  19. 职场上这四件事,越早知道越好
  20. 中科图灵发布国内首家开源免费的智慧消防云平台

热门文章

  1. 全国计算机等级考试模拟系统中 二级c语言的 安装密码,NCRE模拟考试系统安卓版下载-2017全国计算机等级考试二级练习系统v2.4.1 官方版下载__飞翔下载...
  2. 使用Julia进行图像处理--用于扩充训练集的图像增强
  3. 变分自编码器(VAE)详解与实现(tensorflow2.x)
  4. daocloud创建mysql_DaoCloud体验-使用node构建应用程序
  5. c 函数 字符串 find_如何在C ++中使用字符串find()
  6. Java中的原型设计模式
  7. jqueryui时间插件_jQueryUI菜单插件教程示例
  8. 开课吧:大数据时代,数据分析的特点是什么?
  9. 开课吧Java课堂之动态方法调度
  10. 发布一个练笔的 Android 阅读器,轻微仿91 Android 阅读器【后续将提供源码】