Unit Test单元测试时如何模拟HttpContext
参考文章:http://blog.csdn.net/bclz_vs/article/details/6902638
http://www.cnblogs.com/PurpleTide/archive/2011/03/31/2001366.html
http://hi.baidu.com/xiaoduo170/item/a4f79a79c8bc733e71442358
在做单元测试的时候HttpContext.Current是为null的
而有些dll是和HttpContext绑定的(很大原因是...net大部分用于web项目)
或者是试图在windows form 或者console中使用这些dll就挂了...
当然HttpContext.Current是可以赋值的...那么最最简单的方法就是直接new一个HttpContext给它啦
HttpRequest request = new HttpRequest("", "http://localhost", "");
HttpContext.Current = new HttpContext(request, new HttpResponse(new System.IO.StringWriter()));
最后在单元测试类中:
[TestInitialize]
public void MyTestInitialize()
{
HttpContext.Current = new HttpContext(new HttpRequest("", "http://localhost", ""),new HttpResponse(new StringWriter(new StringBuilder())));
}
· 带有[ClassInitialize()]特性的方法在执行类中第一个测试之前调用。
· 带有[TestInitialize()]特性的方法在执行每个测试前都会被调用,一般用来初始化环境,为单元测试配置一个特定已知的状态。
· 带有[ClassCleanup()]特性的方法将在类中所有的测试运行完后执行。
· 带有[TestCleanup()]特性的方法将在每个测试运行完毕后执行,一般用来恢复环境变量到测试前的已知状态,可能是删除一个文件或者恢复数据库记录。 所以[TestInitialize()]的调用时间是在构造函数之后,TestMethod之前。
下表列出了这四个方法的解释和用法。
|
函数名 |
用法 |
|
[ClassInitialize()] MyClassInitialize |
这个方法会在每次调用测试方法前被自动调用。假设在调用AddTest(),DivideTest()等方法之前都需要初始化一些基本数据列表,则这个工作可以放在MyClassInitialize函数里面,不用分别写在每个测试方法里。 |
|
[ClassCleanup()] MyClassCleanup |
这个方法会在每次调用测试方法结束后被自动调用。 |
|
[TestInitialize()] MyTestInitialize |
这个方法会在每次启动一个测试过程前被自动调用。例如本次测试一共选择了AddTest(),DivideTest()两个测试方法,则在调用这两个方法前,MyTestInitialize会先被调用。与MyClassInitialize不同的是,MyClassInitialize是每次调用测试方法时都会被调用,相当于函数级的调用,MyTestInitialize则只在测试过程前会被调用一次,在测试过程结束前,不会再被调用,相当于过程级的调用。 |
|
[TestCleanup()] MyTestCleanup |
这个方法会在每次结束一个测试过程后被自动调用。 |
Visual Studio 之所谓把这四个函数注释掉,原因是这四个函数只是示意性函数(从名字中就可以看出)。关键是看这四个函数的方法属性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相关的属性加到相关的方法上,那么这个方法就具有的上面所描述的功能。
- 为什么需要Mock 本文转载: http://blog.csdn.net/cooleader320/article/details/1907535
- 单元测试的基本原则应该是每次只验证一个方法,但是倘若遇到这样一种情况:
- 测试方法依赖于其他一些难以操控的东西,如:网络,数据库。或者是你测试的代码依赖于系统的其他部分,甚至是系统的多个其他部分。在这种情况下,倘若不小心,最终可能发现自己不小心几乎初始化了系统的每一个组件,而所有这一切只是为了给某一个测试创造必要的运行环境。这不仅花费了大量的时间,要命的是这样的测试用例会被引入大量的耦合因素,很难到达“单元”测试的目的。我们该怎么办呢? 这是Mock的测试方法就派上用场了。Mock的英文的字面意思是:嘲笑,模仿,欺骗的意思。通过Mock,我们可以创建很多真实对象的替代品,在测试用例中使用它。
- 什么情况下考虑使用Mock
1) 真实的对象具有不可确定的行为(如:程序需要通过web service获得股票的实时价格)2) 对象很难被创建(如系统环境很难初始化)3) 真实对象的某些行为很难被触发(如网络错误,数据库ID自增序列溢出)4) 真实的对象令程序运行很缓慢5) 真实对象含有UI等不方便测试的因素6) 测试需要询问真实对象是如何被调用的(如异步调用的情况,需要验证Callbak的函数)7) 真实的对象目前还不存在(如依赖于其他项目组或则需要新的硬件系统)
Unit Test单元测试时如何模拟HttpContext的更多相关文章
- SSM单元测试时出现:Failed to load ApplicationContext的一种可能解决办法
SSM单元测试时出现: 严重: Caught exception while allowing TestExecutionListener [org.springframework.test.cont ...
- SpringAOP单元测试时找不到文件。
...applicationContext.xml] cannot be opened because it does not exist. 刚才在进行单元测试时,报这个错,我把它放到了src的某个包 ...
- 单元测试时使用Ninject的小问题
主要是Kernel没有被释放,Ninject的Kernel必须调用IDispose释放.也有可能是静态类型在VS单元测试时无法被释放. 先记录下这个问题
- [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]
[易学易懂系列|rustlang语言|零基础|快速入门|(15)] 实用知识 Unit Testing单元测试 我们知道,在现代软件开发的过程中,单元测试对软件的质量极及重要. 今天我们来看看Rust ...
- SSM项目使用junit单元测试时Mybaties通配符加载Mapper不能正常加载
个人博客 地址:http://www.wenhaofan.com/article/20181108104133 问题描述 项目使用maven build 以及tomcat run能够正常运行,但是使用 ...
- 使用@RunWith(SpringJUnit4ClassRunner.class)进行单元测试时 报错 和 java.lang.NoSuchMethodError的解决方法
1 使用@RunWith(SpringJUnit4ClassRunner.class)进行单元测试时,需要junit高版本和spring-test的高版本才支持,junit需要4.0以上的,sprin ...
- [转]模拟HttpContext 实现ASP.NET MVC 的单元测试
众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...
- 模拟HttpContext单元测试
众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...
- [mock open]PyUnit执行单元测试时使用字符串模拟文件对象
def mock_open(data): from StringIO import StringIO stmp = StringIO(data) return stmp _open = __built ...
随机推荐
- 过滤HTML
过滤HTML public static string NoHTML(string html){ string[] strArray2 = new string[] { "font" ...
- 网站开发常用jQuery插件总结(二)弹出层插件Lightbox_me
网站开发过程中,为了增加网站交互效果,我们有时需要在当前页面弹出诸如登陆.注册.设置等窗口.而这些窗口就是层,弹出的窗口就是弹出层.jQuery中弹出层插件很多,但有些在html5+css3浏览器下, ...
- Silverlight中在MVVM模式下对DatagridRow选择控件封装
在项目中,凡是涉及到表格的地方用的最多的控件,自然少不了DataGrid的身影,它明了的展示各种数据让人十分喜欢.现在要实现一个功能,使DataGrid具有全选和项选中的功能,如果在传统后台代码中完成 ...
- C语言学习总结(三) 复杂类型
第五章.复杂数据类型 (数组.字符串.指针.结构体.枚举.共同体) 1.什么是数组? 概念:把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组: 按数组元素的类型不 ...
- Encoding 类别
Encoding 類別 .NET Framework 4.5 表示字元編碼方式. 繼承階層架構 System.Object System.Text.Encoding System.Tex ...
- ZeroBraneStudio之支持GBK文件编码
费了好大劲终于搞定了让ZBS支持打开GBK文件了.记录下过程: 看源码发现ZBS打开文件时会调用src\editor\commands.lua中的LoadFile函数,代码如下: local file ...
- ShareSDK(iOS版)开发实践:自定义授权视图和分享视图导航栏
最近很多人问ShareSDK的授权视图和分享视图的导航栏样式与应用风格不一致,能否修改导航栏的样式?那么这里我就2.6.1版本进行说明(还在使用1.x版本的朋友建议升级到2.x版本,在新版本中可定制的 ...
- 怎么跳出MySQL的10个大坑
淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...
- Python写UTF8文件,UE、记事本打开依然乱码的问题
Python写UTF8文件,UE.记事本打开依然乱码的问题 Leave a reply 现象:使用codecs打开文件,写入UTF-8文本,正常无错误.用vim打开正常,但记事本.UE等打开乱码. 原 ...
- Park Visit
hdu4607:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题意:给你一棵树,树上每条边的权值是1,然后然你选择m个点,求遍历m个点的最小花费. 题解 ...